data <- read.csv("philosophy_data.csv")

A general analysis of the data set

First, as a total beginner of philosophy, I try to have a general knowledge of the schools, the philosophers, and also the history of philosophy.

The percentage of the amount of sentences published by each school

Given the data set, what confused me most is the 18 listed schools in philosophy. So I tried to know more about the schools first. Below is the count of sentences published by each school:

Knowing about the history of philosophy can always start with knowing the development of it over time. So I choose to analyze the sentences published in different time period.

Analysis of sentences published in different time period

To start with, I choose to know about the count of sentences published by different schools from 4th Century BC to 20th Century.

Count of sentences of different schools published from 4th Century BC to the 20th Century

publish_date <- data %>%
  dplyr::select(title, author, school, original_publication_date) %>%
  group_by(original_publication_date, school) %>%
  summarize(count = n())
`summarise()` has grouped output by 'original_publication_date'. You can override using the `.groups` argument.
head(publish_date)

count_with_time <- publish_date %>%
  ggplot(aes(x = original_publication_date))+
  geom_bar(aes(y = count, fill = school), stat = "identity")+
  labs(x = "Year", 
       y = "Count", 
       title = "Count of Sentences of Different Schools Published 
       from 4th Century BC to the 20th Century")
count_with_time

We can know from the figure that there are 2 major schools which published a large amount of sentences before 0th Century, which in know as a period for ancient Greek philosophy and ancient Rome philosophy, in which time period Plato and Aristotle are well-known. And from 18th Century to 21th Century, many schools of philosophy appears making philosophy developing prosperously, which may thanks to The Enlightenment.

So, after consulting information, I divide the data set into 3 parts according to time period.

First, denote years before 0th Century as time period 1, in which philosophy are known as Ancient Greek philosophy and Ancient Rome philosophy.

Second, denote years between 0th Century and the end of 16th Century as time period 2, in which philosophy are known as Medieval philosophy.

Finally denote years after 1700 AD as time period 3, in which philosophy are known as Modern philosophy.

To learn about if philosophy is affected by different times, we think about three major questions:

1.What questions are the philosophers thinking about at different times?

2.Whether different schools in the same time period are concerning about similar questions?

3.Whether philosophers in different time period think about totally different questions?

Question 1: What questions are the philosophers thinking about at different times?

#sort(unique(data$original_publication_date))

publish_date_classify_1 <- data %>%
  filter(original_publication_date < 0)

publish_date_classify_2 <- data %>%
  filter((original_publication_date > 0) &
           (original_publication_date < 1600))

publish_date_classify_3 <- data %>%
  filter((original_publication_date > 1600))

To analyze the questions discussed by the philosophers, I plan to analyze the sentences published by them, which means counting the frequency of words used in the published sentences. In this way, we consider a problem related to a word appearing in high frequency more commonly considered by the philosophers, while as for the words which turns up rarely, we think them irrelevant. So I calculate the frequency of appearance of words in the published sentences respectively in three time period.

Wordcloud for time period 1

sentenceCorpus1 <- Corpus(VectorSource(publish_date_classify_1$sentence_lowered))
sentenceCorpus1 <- tm_map(sentenceCorpus1, removeWords, stopwords(""))
sentenceCorpus1 <- tm_map(sentenceCorpus1, removeWords, character(0))
sentenceCorpus1 <- tm_map(sentenceCorpus1, removePunctuation)
sentenceCorpus1 <- tm_map(sentenceCorpus1, stripWhitespace)
term_matrix1 <- TermDocumentMatrix(sentenceCorpus1)
term_matrix1 = removeSparseTerms(term_matrix1, 0.99)
term_matrix1_tidy = tidytext::tidy(term_matrix1)
term_matrix1_overall=summarise(group_by(term_matrix1_tidy, term), sum(count))
term_matrix1_perc <- term_matrix1_overall %>%
  mutate(perc = `sum(count)`/sum(`sum(count)`)) %>%
  arrange(desc(perc))
head(term_matrix1_perc,n=10)

wordcloud(term_matrix1_overall$term,term_matrix1_overall$`sum(count)`,min.freq=9.5,col=brewer.pal(8,"Dark2"),rot.per=0.3)

It can be seen from the figure that except for the words that are used commonly in nearly all kinds of sentences such as “one”, “will”, “must”, “also”, there are others words including “man”, “people”, “time”, “water”, “animals”, or “knowledge”, “true”, “body”, “soul” appearing frequently reflecting some exact questions which were thought about.

Wordcloud for time period 2

In this time period, what interests me most is the high frequency of appearance of the words “women”, and also “women”, which turns up even more often than words “one”, “will”, or “can”. Besides, except for the words we’ve seen in the last picture, words such as “love”, “children”, “female”, “husband” appears more common.

Wordcloud for time period 3

At this time, we can see that in stead of only several words turning up frequently while others rarely appearing, more words began to be used in the sentences, which means that more kinds of questions began to be discussed by philosophers at the same time. And the words “nature”, “reason”, “world”, “consciousness”, “labour”, “law”, “order”, “concept”, “god”, “language” and also “system” prove that.

Question 2: Whether different schools in the same time period are concerning about similar questions?

To measure the similarity of the questions concerned about by two different schools, I choose to measure the similarity of the words used in the published sentences by the schools. And to measure the similarity of the words used between two schools, I calculate Jaccard Index which is defined as the size of the intersection divided by the size of the union of the sample sets.

# the size of intersection
size_intersection <- function(A,B){
  X <- A %>%
    inner_join(B, by = c("term" = "term"))
  nrow(X)
}

# the size of union
size_union <- function(A,B){
  X <-A %>%
    full_join(B, by = c("term" = "term"))
  nrow(X)
}

#Jaccard Index
JI <- function(A,B){
  size_intersection(A,B)/size_union(A,B)
}

Moreover, to seize the major questions discussed by the philosophers, I choose the words which appears in the sentences published by one school at the percentage over 0.5% as the samples, depending on which we calculate the Jaccard Index.

Time period 1

First, we have a quick look of the percentage of the amount of sentences published by different schools in time period 1.

Percentage of the amount of sentences published by different schools in time period 1

We can see there are three major schools including Aristotle, Daoism and Plato at this time.

Then, let’s check the words used respectively in the 3 schools.

Words used respectively in the 3 schools in time period 1

Aristotle

Plato

Daoism

We can see that there are more different words used in Daoism such as “tzu” or “tao”, and this is because Daoism origins in China, and the sentences are always like “Tzu said…”.

Comparision between the schools in time period 1

We calculate Jaccard Index and have the results:

          aristotle     plato    daoism
aristotle 1.0000000 0.4226804 0.1982759
plato     0.4226804 1.0000000 0.2521008
daoism    0.1982759 0.2521008 1.0000000

We can see that Aristotle and Plato have larger Jaccard Index, while Daoism is less similar to both of them. This can be easily understood because Plato is Aristotle’s teacher and Plato philosophy and Aristotle philosophy have the same origin even though they have different thoughts. However, Daoism comes from a totally different culture.

Time period 2

Same as what we did in the previous step, we first check the percentage of the amount of sentences published by different schools in this time period.

Percentage of the amount of sentences published by different schools in time period 2

We can see that there are only two majoy philosophy schools at this time: Scholasticism and Stoicism.

Next, check the words used respectively in the 2 schools.

Words used in the 2 schools in time period 2

Scholasticism

Stoicism

Comparision between the schools in time period 2
              scholasticism  stoicism
scholasticism     1.0000000 0.2285714
stoicism          0.2285714 1.0000000

It can be seen that the Jaccard Index between two schools is 0.23.

Time period 3

Same as what we did in the previous step, we first check the percentage of the amount of sentences published by different schools in this time period.

Percentage of the amount of sentences published by different schools in time period 3

As is shown, the amount of schools living in this time period reaches 13. And we check the words used by them and calculate the Jaccard Index to derive the similarity.

Words used in the 13 schools in time period 3

Analytic

Capitalism

Empiricism

Rationalism

Continental

German_idealism

Phenomenology

Communism

Nietzsche

Feminism

Hobbes

Kierkegaard

Existentialism

Comparision between the schools in time period 3

We calculate Jaccard Index and have the results:

                empiricism rationalism  analytic continental phenomenology german_idealism
empiricism       1.0000000   0.3815789 0.2342342   0.2604167    0.21875000       0.2375000
rationalism      0.3815789   1.0000000 0.2586207   0.2621359    0.20000000       0.2413793
analytic         0.2342342   0.2586207 1.0000000   0.3064516    0.27419355       0.2612613
continental      0.2604167   0.2621359 0.3064516   1.0000000    0.37864078       0.2916667
phenomenology    0.2187500   0.2000000 0.2741935   0.3786408    1.00000000       0.3483146
german_idealism  0.2375000   0.2413793 0.2612613   0.2916667    0.34831461       1.0000000
communism        0.1685393   0.1530612 0.1417323   0.1834862    0.15740741       0.1758242
capitalism       0.1839080   0.1200000 0.1076923   0.1130435    0.09734513       0.1041667
nietzsche        0.3536585   0.3636364 0.2160000   0.2710280    0.23364486       0.2000000
feminism         0.1794872   0.3008850 0.2094595   0.2255639    0.22307692       0.1848739
kierkegaard      0.1847826   0.1919192 0.2000000   0.1858407    0.18181818       0.1666667
hobbes           0.3013699   0.2235294 0.1525424   0.1764706    0.11538462       0.1666667
existentialism   0.1847826   0.1800000 0.1904762   0.2407407    0.25000000       0.2584270
                communism capitalism nietzsche  feminism kierkegaard    hobbes existentialism
empiricism      0.1685393 0.18390805 0.3536585 0.1794872   0.1847826 0.3013699     0.18478261
rationalism     0.1530612 0.12000000 0.3636364 0.3008850   0.1919192 0.2235294     0.18000000
analytic        0.1417323 0.10769231 0.2160000 0.2094595   0.2000000 0.1525424     0.19047619
continental     0.1834862 0.11304348 0.2710280 0.2255639   0.1858407 0.1764706     0.24074074
phenomenology   0.1574074 0.09734513 0.2336449 0.2230769   0.1818182 0.1153846     0.25000000
german_idealism 0.1758242 0.10416667 0.2000000 0.1848739   0.1666667 0.1666667     0.25842697
communism       1.0000000 0.23333333 0.1442308 0.1406250   0.1250000 0.1195652     0.11428571
capitalism      0.2333333 1.00000000 0.1568627 0.1153846   0.1372549 0.1086957     0.05454545
nietzsche       0.1442308 0.15686275 1.0000000 0.4036697   0.3191489 0.3095238     0.13761468
feminism        0.1406250 0.11538462 0.4036697 1.0000000   0.2583333 0.2017544     0.13533835
kierkegaard     0.1250000 0.13725490 0.3191489 0.2583333   1.0000000 0.2272727     0.15094340
hobbes          0.1195652 0.10869565 0.3095238 0.2017544   0.2272727 1.0000000     0.12500000
existentialism  0.1142857 0.05454545 0.1376147 0.1353383   0.1509434 0.1250000     1.00000000

It can be seen that there are schools which are pretty similar, while there are still some schools having little similarity to another such as Communism or Capitalism.

As a result, we cannot conclude that different schools at the same time are concerning similar questions.

Question 3: If philosophers at different time period think about totally different questions?

                aristotle     plato     daoism scholasticism  stoicism empiricism rationalism
aristotle       1.0000000 0.4226804 0.19827586     0.2264151 0.2959184  0.2727273   0.3908046
plato           0.4226804 1.0000000 0.25210084     0.2500000 0.3047619  0.2577320   0.3367347
daoism          0.1982759 0.2521008 1.00000000     0.1557377 0.2432432  0.1603774   0.2110092
scholasticism   0.2264151 0.2500000 0.15573770     1.0000000 0.2285714  0.2258065   0.2424242
stoicism        0.2959184 0.3047619 0.24324324     0.2285714 1.0000000  0.3058824   0.3636364
empiricism      0.2727273 0.2577320 0.16037736     0.2258065 0.3058824  1.0000000   0.3815789
rationalism     0.3908046 0.3367347 0.21100917     0.2424242 0.3636364  0.3815789   1.0000000
analytic        0.3189655 0.3145161 0.16312057     0.1481481 0.2258065  0.2342342   0.2586207
continental     0.2924528 0.2148760 0.17460317     0.2410714 0.2252252  0.2604167   0.2621359
phenomenology   0.2314815 0.1916667 0.16129032     0.2053571 0.2222222  0.2187500   0.2000000
german_idealism 0.2637363 0.1792453 0.13513514     0.1700000 0.2000000  0.2375000   0.2413793
communism       0.1881188 0.1403509 0.08264463     0.1730769 0.1226415  0.1685393   0.1530612
capitalism      0.1553398 0.1315789 0.08333333     0.1415094 0.1456311  0.1839080   0.1200000
nietzsche       0.3092784 0.3838384 0.25454545     0.3437500 0.4482759  0.3536585   0.3636364
feminism        0.2320000 0.2812500 0.25000000     0.2682927 0.4166667  0.1794872   0.3008850
kierkegaard     0.2135922 0.2162162 0.22522523     0.2211538 0.2783505  0.1847826   0.1919192
hobbes          0.2613636 0.2100000 0.19607843     0.1894737 0.2790698  0.3013699   0.2235294
existentialism  0.1682243 0.1157025 0.13333333     0.1441441 0.1376147  0.1847826   0.1800000
                 analytic continental phenomenology german_idealism  communism capitalism
aristotle       0.3189655   0.2924528    0.23148148       0.2637363 0.18811881 0.15533981
plato           0.3145161   0.2148760    0.19166667       0.1792453 0.14035088 0.13157895
daoism          0.1631206   0.1746032    0.16129032       0.1351351 0.08264463 0.08333333
scholasticism   0.1481481   0.2410714    0.20535714       0.1700000 0.17307692 0.14150943
stoicism        0.2258065   0.2252252    0.22222222       0.2000000 0.12264151 0.14563107
empiricism      0.2342342   0.2604167    0.21875000       0.2375000 0.16853933 0.18390805
rationalism     0.2586207   0.2621359    0.20000000       0.2413793 0.15306122 0.12000000
analytic        1.0000000   0.3064516    0.27419355       0.2612613 0.14173228 0.10769231
continental     0.3064516   1.0000000    0.37864078       0.2916667 0.18348624 0.11304348
phenomenology   0.2741935   0.3786408    1.00000000       0.3483146 0.15740741 0.09734513
german_idealism 0.2612613   0.2916667    0.34831461       1.0000000 0.17582418 0.10416667
communism       0.1417323   0.1834862    0.15740741       0.1758242 1.00000000 0.23333333
capitalism      0.1076923   0.1130435    0.09734513       0.1041667 0.23333333 1.00000000
nietzsche       0.2160000   0.2710280    0.23364486       0.2000000 0.14423077 0.15686275
feminism        0.2094595   0.2255639    0.22307692       0.1848739 0.14062500 0.11538462
kierkegaard     0.2000000   0.1858407    0.18181818       0.1666667 0.12500000 0.13725490
hobbes          0.1525424   0.1764706    0.11538462       0.1666667 0.11956522 0.10869565
existentialism  0.1904762   0.2407407    0.25000000       0.2584270 0.11428571 0.05454545
                nietzsche  feminism kierkegaard    hobbes existentialism
aristotle       0.3092784 0.2320000   0.2135922 0.2613636     0.16822430
plato           0.3838384 0.2812500   0.2162162 0.2100000     0.11570248
daoism          0.2545455 0.2500000   0.2252252 0.1960784     0.13333333
scholasticism   0.3437500 0.2682927   0.2211538 0.1894737     0.14414414
stoicism        0.4482759 0.4166667   0.2783505 0.2790698     0.13761468
empiricism      0.3536585 0.1794872   0.1847826 0.3013699     0.18478261
rationalism     0.3636364 0.3008850   0.1919192 0.2235294     0.18000000
analytic        0.2160000 0.2094595   0.2000000 0.1525424     0.19047619
continental     0.2710280 0.2255639   0.1858407 0.1764706     0.24074074
phenomenology   0.2336449 0.2230769   0.1818182 0.1153846     0.25000000
german_idealism 0.2000000 0.1848739   0.1666667 0.1666667     0.25842697
communism       0.1442308 0.1406250   0.1250000 0.1195652     0.11428571
capitalism      0.1568627 0.1153846   0.1372549 0.1086957     0.05454545
nietzsche       1.0000000 0.4036697   0.3191489 0.3095238     0.13761468
feminism        0.4036697 1.0000000   0.2583333 0.2017544     0.13533835
kierkegaard     0.3191489 0.2583333   1.0000000 0.2272727     0.15094340
hobbes          0.3095238 0.2017544   0.2272727 1.0000000     0.12500000
existentialism  0.1376147 0.1353383   0.1509434 0.1250000     1.00000000
corrplot(JI_overall, diag = FALSE)

From the plot, we can see that Aristotle has greater similarity to Plato and Rationalism; Plato is pretty similar to Aristotle and Nietzsche; Stoicism has similarity to Rationalism, Nietzsche and Feminism; Nietzsche is similar to Plato, Scholasticism, Stoicism, Empiricism, Rationalism, and also Feminism.

This means that even new problems appearing at a new time were discussed by the philosophers then, many questions raised by ancient philosophers are still thought about by later philosophers and the solution or explaination to them may differ as time goes by.

However, this is only an analysis based on single words used in the sentences, which means that even two school with exactly different opinions may have pretty high similarity. For instance, though there appears high similarity between Feminism and Stoicism, they cannot be similar actually because Stoicism focus on the active relationship between cosmic determinism and human freedom, while Feminism is a collection of movements and ideologies that aims to define, establish, and defend equal political, economic, cultural, and social rights for women.

Conclusion

  1. As time goes by, philosophers do rise and discuss different questions in different time period.

  2. At the same time, different schools may concern different questions.

  3. Even though human society develops, many original ideas and thoughts in ancient times are still thought about by people in later years.

  4. Except for time, other factors such as originating country of the schools, relationship between the schools, or focuses of thoughts of different authors in the schools should also be considered while studying the history of philosophy. So the analysis can be improved if we take the other factors into consideration.

LS0tCnRpdGxlOiAiV2hldGhlciB0aGUgd29yZHMgdXNlZCBpbiB0aGUgc2VudGVuY2VzIHB1Ymxpc2hlZCBieSBkaWZmZXJlbnQgcGhpbG9zb3BoeSBzY2hvb2xzIGFyZSBhZmZlY3RlZCBieSBwdWJsaXNoIHRpbWUuIgphdXRob3I6ICJGdWNoZW5nIExpdSIKZGF0ZTogIjIvMS8yMDIyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQojbG9hZCB0aGUgcGFja2FnZXMKI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dGV4dCIpCiNpbnN0YWxsLnBhY2thZ2VzKCJjb3JycGxvdCIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodG0pCmxpYnJhcnkod29yZGNsb3VkKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KGNvcnJwbG90KQpgYGAKCmBgYHtyfQojcmVhZCB0aGUgZGF0YSBzZXQKZGF0YSA8LSByZWFkLmNzdigicGhpbG9zb3BoeV9kYXRhLmNzdiIpCmBgYAoKIyBBIGdlbmVyYWwgYW5hbHlzaXMgb2YgdGhlIGRhdGEgc2V0CkZpcnN0LCBhcyBhIHRvdGFsIGJlZ2lubmVyICBvZiBwaGlsb3NvcGh5LCBJIHRyeSB0byBoYXZlIGEgZ2VuZXJhbCBrbm93bGVkZ2Ugb2YgdGhlIHNjaG9vbHMsIHRoZSBwaGlsb3NvcGhlcnMsIGFuZCBhbHNvIHRoZSBoaXN0b3J5IG9mIHBoaWxvc29waHkuCgojIyBUaGUgcGVyY2VudGFnZSBvZiB0aGUgYW1vdW50IG9mIHNlbnRlbmNlcyBwdWJsaXNoZWQgYnkgZWFjaCBzY2hvb2wKR2l2ZW4gdGhlIGRhdGEgc2V0LCB3aGF0IGNvbmZ1c2VkIG1lIG1vc3QgaXMgdGhlIDE4IGxpc3RlZCBzY2hvb2xzIGluIHBoaWxvc29waHkuIFNvIEkgdHJpZWQgdG8ga25vdyBtb3JlIGFib3V0IHRoZSBzY2hvb2xzIGZpcnN0LiBCZWxvdyBpcyB0aGUgY291bnQgb2Ygc2VudGVuY2VzIHB1Ymxpc2hlZCBieSBlYWNoIHNjaG9vbDoKYGBge3IsZWNobz1GQUxTRX0Kc2Nob29sIDwtIHVuaXF1ZShkYXRhJHNjaG9vbCkKY291bnRfb2ZfZGlmZmVyZW50X3NjaG9vbCA8LSBkYXRhICU+JQogIGdyb3VwX2J5KHNjaG9vbCkgJT4lCiAgc3VtbWFyaXplKGNvdW50X3NjaG9vbCA9IG4oKSkgJT4lCiAgYXJyYW5nZShkZXNjKGNvdW50X3NjaG9vbCkpCgpwZXJjX29mX2RpZmZlcmVudF9zY2hvb2wgPC0gY291bnRfb2ZfZGlmZmVyZW50X3NjaG9vbCAlPiUKICBtdXRhdGUoc3VtID0gc3VtKGNvdW50X3NjaG9vbCkpICU+JQogIG11dGF0ZShwZXJjZW50ID0gY291bnRfc2Nob29sL3N1bSkgJT4lCiAgbXV0YXRlKHBlcmNlbnQgPSBwYXN0ZTAoZm9ybWF0KHBlcmNlbnQqMTAwLCBkaWdpdHMgPSAyKSwgIiUiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChzY2hvb2wsIGNvdW50X3NjaG9vbCwgcGVyY2VudCkKcGVyY19vZl9kaWZmZXJlbnRfc2Nob29sCgpwZXJjX29mX2RpZmZlcmVudF9zY2hvb2xfZmlnIDwtIHBlcmNfb2ZfZGlmZmVyZW50X3NjaG9vbCAlPiUKICBnZ3Bsb3QoYWVzKHg9IiIsIHk9cGVyY2VudCwgZmlsbD1zY2hvb2wpKSsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKwogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSsKICBsYWJzKHg9IiIsIAogICAgICAgeT0iIiwgCiAgICAgICB0aXRsZT0iVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGFtb3VudCBvZiBzZW50ZW5jZXMgCiAgICAgICBwdWJsaXNoZWQgYnkgZWFjaCBzY2hvb2wiKSsKICB0aGVtZShheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkKcGVyY19vZl9kaWZmZXJlbnRfc2Nob29sX2ZpZwpgYGAKCgoKYGBge3Igd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQojIyBUaGUgcGVyY2VudGFnZSBvZiB0aGUgYW1vdW50IG9mIHNlbnRlbmNlcyBwdWJsaXNoZWQgYnkgZWFjaCBwaGlsb3NvcGhlcgojVGhlbiwgSSBmb3VuZCB0aGF0IHRoZXJlIGFyZSBzb21lIHNjaG9vbHMgd2hpY2ggY29udGFpbnMgYSBsb3Qgb2YgcGhpbG9zb3BoZXJzLCB3aGlsZSBvdGhlcnMgaGF2ZSBmZXcuIEhvd2V2ZXIsIHRoZXJlIGFyZSBldmVuIG1vcmUgc2VudGVuY2VzIHB1Ymxpc2hlZCBieSB0aGUgc2Nob29scyB3aXRoIGZldyBwaGlsb3NvcGhlcnMgdGhhbiB0aG9zZSBjb250YWluaW5nIG1vcmUgcGhpbG9zb3BoZXJzLCBzdWNoIGFzIEFyaXN0b3RsZSBhbmQgUGxhdG8uIAojU28gSSBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBzZW50ZW5jZXMgcHVibGlzaGVkIGJ5IGRpZmZlcmVudCBhdXRob3JzIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggc2Nob29scyB0aGV5IGJlbG9uZyB0by4KI2NvdW50X29mX2RpZmZlcmVudF9hdXRob3JfaW5fZWFjaF9zY2hvb2wgPC0gZGF0YSAlPiUKIyAgZ3JvdXBfYnkoc2Nob29sLGF1dGhvcikgJT4lCiMgIHN1bW1hcml6ZShjb3VudF9hdXRob3IgPSBuKCkpICU+JQojICBhcnJhbmdlKHNjaG9vbCxkZXNjKGNvdW50X2F1dGhvcikpICU+JQojICBsZWZ0X2pvaW4oY291bnRfb2ZfZGlmZmVyZW50X3NjaG9vbCwgYnkgPSAnc2Nob29sJykgJT4lCiMgIGRwbHlyOjpzZWxlY3Qoc2Nob29sLCBhdXRob3IsIGNvdW50X2F1dGhvcikgJT4lCiMgIGFycmFuZ2UoZGVzYyhjb3VudF9hdXRob3IpKQojY291bnRfb2ZfZGlmZmVyZW50X2F1dGhvcl9pbl9lYWNoX3NjaG9vbApgYGAKCktub3dpbmcgYWJvdXQgdGhlIGhpc3Rvcnkgb2YgcGhpbG9zb3BoeSBjYW4gYWx3YXlzIHN0YXJ0IHdpdGgga25vd2luZyB0aGUgZGV2ZWxvcG1lbnQgb2YgaXQgb3ZlciB0aW1lLiBTbyBJIGNob29zZSB0byBhbmFseXplIHRoZSBzZW50ZW5jZXMgcHVibGlzaGVkIGluIGRpZmZlcmVudCB0aW1lIHBlcmlvZC4KCiMgQW5hbHlzaXMgb2Ygc2VudGVuY2VzIHB1Ymxpc2hlZCBpbiBkaWZmZXJlbnQgdGltZSBwZXJpb2QKVG8gc3RhcnQgd2l0aCwgSSBjaG9vc2UgdG8ga25vdyBhYm91dCB0aGUgY291bnQgb2Ygc2VudGVuY2VzIHB1Ymxpc2hlZCBieSBkaWZmZXJlbnQgc2Nob29scyBmcm9tIDR0aCBDZW50dXJ5IEJDIHRvIDIwdGggQ2VudHVyeS4KCiMjIENvdW50IG9mIHNlbnRlbmNlcyBvZiBkaWZmZXJlbnQgc2Nob29scyBwdWJsaXNoZWQgZnJvbSA0dGggQ2VudHVyeSBCQyB0byB0aGUgMjB0aCBDZW50dXJ5CmBgYHtyIHdhcm5pbmc9RkFMU0V9CnB1Ymxpc2hfZGF0ZSA8LSBkYXRhICU+JQogIGRwbHlyOjpzZWxlY3QodGl0bGUsIGF1dGhvciwgc2Nob29sLCBvcmlnaW5hbF9wdWJsaWNhdGlvbl9kYXRlKSAlPiUKICBncm91cF9ieShvcmlnaW5hbF9wdWJsaWNhdGlvbl9kYXRlLCBzY2hvb2wpICU+JQogIHN1bW1hcml6ZShjb3VudCA9IG4oKSkKcHVibGlzaF9kYXRlCgpjb3VudF93aXRoX3RpbWUgPC0gcHVibGlzaF9kYXRlICU+JQogIGdncGxvdChhZXMoeCA9IG9yaWdpbmFsX3B1YmxpY2F0aW9uX2RhdGUpKSsKICBnZW9tX2JhcihhZXMoeSA9IGNvdW50LCBmaWxsID0gc2Nob29sKSwgc3RhdCA9ICJpZGVudGl0eSIpKwogIGxhYnMoeCA9ICJZZWFyIiwgCiAgICAgICB5ID0gIkNvdW50IiwgCiAgICAgICB0aXRsZSA9ICJDb3VudCBvZiBTZW50ZW5jZXMgb2YgRGlmZmVyZW50IFNjaG9vbHMgUHVibGlzaGVkIAogICAgICAgZnJvbSA0dGggQ2VudHVyeSBCQyB0byB0aGUgMjB0aCBDZW50dXJ5IikKY291bnRfd2l0aF90aW1lCgpgYGAKV2UgY2FuIGtub3cgZnJvbSB0aGUgZmlndXJlIHRoYXQgdGhlcmUgYXJlIDIgbWFqb3Igc2Nob29scyB3aGljaCBwdWJsaXNoZWQgYSBsYXJnZSBhbW91bnQgb2Ygc2VudGVuY2VzIGJlZm9yZSAwdGggQ2VudHVyeSwgd2hpY2ggaW4ga25vdyBhcyBhIHBlcmlvZCBmb3IgYW5jaWVudCBHcmVlayBwaGlsb3NvcGh5IGFuZCBhbmNpZW50IFJvbWUgcGhpbG9zb3BoeSwgaW4gd2hpY2ggdGltZSBwZXJpb2QgUGxhdG8gYW5kIEFyaXN0b3RsZSBhcmUgd2VsbC1rbm93bi4gQW5kIGZyb20gMTh0aCBDZW50dXJ5IHRvIDIxdGggQ2VudHVyeSwgbWFueSBzY2hvb2xzIG9mIHBoaWxvc29waHkgYXBwZWFycyBtYWtpbmcgcGhpbG9zb3BoeSBkZXZlbG9waW5nIHByb3NwZXJvdXNseSwgd2hpY2ggbWF5IHRoYW5rcyB0byBUaGUgRW5saWdodGVubWVudC4KClNvLCBhZnRlciBjb25zdWx0aW5nIGluZm9ybWF0aW9uLCBJIGRpdmlkZSB0aGUgZGF0YSBzZXQgaW50byAzIHBhcnRzIGFjY29yZGluZyB0byB0aW1lIHBlcmlvZC4KCkZpcnN0LCBkZW5vdGUgeWVhcnMgYmVmb3JlIDB0aCBDZW50dXJ5IGFzIHRpbWUgcGVyaW9kIDEsIGluIHdoaWNoIHBoaWxvc29waHkgYXJlIGtub3duIGFzIEFuY2llbnQgR3JlZWsgcGhpbG9zb3BoeSBhbmQgQW5jaWVudCBSb21lIHBoaWxvc29waHkuCgpTZWNvbmQsIGRlbm90ZSB5ZWFycyBiZXR3ZWVuIDB0aCBDZW50dXJ5IGFuZCB0aGUgZW5kIG9mIDE2dGggQ2VudHVyeSBhcyB0aW1lIHBlcmlvZCAyLCBpbiB3aGljaCBwaGlsb3NvcGh5IGFyZSBrbm93biBhcyBNZWRpZXZhbCBwaGlsb3NvcGh5LgoKRmluYWxseSBkZW5vdGUgeWVhcnMgYWZ0ZXIgMTcwMCBBRCBhcyB0aW1lIHBlcmlvZCAzLCBpbiB3aGljaCBwaGlsb3NvcGh5IGFyZSBrbm93biBhcyBNb2Rlcm4gcGhpbG9zb3BoeS4KClRvIGxlYXJuIGFib3V0IGlmIHBoaWxvc29waHkgaXMgYWZmZWN0ZWQgYnkgZGlmZmVyZW50IHRpbWVzLCB3ZSB0aGluayBhYm91dCB0aHJlZSBtYWpvciBxdWVzdGlvbnM6CgoxLldoYXQgcXVlc3Rpb25zIGFyZSB0aGUgcGhpbG9zb3BoZXJzIHRoaW5raW5nIGFib3V0IGF0IGRpZmZlcmVudCB0aW1lcz8KCjIuV2hldGhlciBkaWZmZXJlbnQgc2Nob29scyBpbiB0aGUgc2FtZSB0aW1lIHBlcmlvZCBhcmUgY29uY2VybmluZyBhYm91dCBzaW1pbGFyIHF1ZXN0aW9ucz8KCjMuV2hldGhlciBwaGlsb3NvcGhlcnMgaW4gZGlmZmVyZW50IHRpbWUgcGVyaW9kIHRoaW5rIGFib3V0IHRvdGFsbHkgZGlmZmVyZW50IHF1ZXN0aW9ucz8KCiMjIFF1ZXN0aW9uIDE6IFdoYXQgcXVlc3Rpb25zIGFyZSB0aGUgcGhpbG9zb3BoZXJzIHRoaW5raW5nIGFib3V0IGF0IGRpZmZlcmVudCB0aW1lcz8KYGBge3J9CiNzb3J0IHRoZSBkYXRhIHNldCBpbnRvIDMgZ3JvdXBzIGFjY29yZGluZyB0byB0aW1lCnB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8xIDwtIGRhdGEgJT4lCiAgZmlsdGVyKG9yaWdpbmFsX3B1YmxpY2F0aW9uX2RhdGUgPCAwKQoKcHVibGlzaF9kYXRlX2NsYXNzaWZ5XzIgPC0gZGF0YSAlPiUKICBmaWx0ZXIoKG9yaWdpbmFsX3B1YmxpY2F0aW9uX2RhdGUgPiAwKSAmCiAgICAgICAgICAgKG9yaWdpbmFsX3B1YmxpY2F0aW9uX2RhdGUgPCAxNjAwKSkKCnB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8zIDwtIGRhdGEgJT4lCiAgZmlsdGVyKChvcmlnaW5hbF9wdWJsaWNhdGlvbl9kYXRlID4gMTYwMCkpCmBgYAoKVG8gYW5hbHl6ZSB0aGUgcXVlc3Rpb25zIGRpc2N1c3NlZCBieSB0aGUgcGhpbG9zb3BoZXJzLCBJIHBsYW4gdG8gYW5hbHl6ZSB0aGUgc2VudGVuY2VzIHB1Ymxpc2hlZCBieSB0aGVtLCB3aGljaCBtZWFucyBjb3VudGluZyB0aGUgZnJlcXVlbmN5IG9mIHdvcmRzIHVzZWQgaW4gdGhlIHB1Ymxpc2hlZCBzZW50ZW5jZXMuIApJbiB0aGlzIHdheSwgd2UgY29uc2lkZXIgYSBwcm9ibGVtIHJlbGF0ZWQgdG8gYSB3b3JkIGFwcGVhcmluZyBpbiBoaWdoIGZyZXF1ZW5jeSBtb3JlIGNvbW1vbmx5IGNvbnNpZGVyZWQgYnkgdGhlIHBoaWxvc29waGVycywgd2hpbGUgYXMgZm9yIHRoZSB3b3JkcyB3aGljaCB0dXJucyB1cCByYXJlbHksIHdlIHRoaW5rIHRoZW0gaXJyZWxldmFudC4gClNvIEkgY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgb2YgYXBwZWFyYW5jZSBvZiB3b3JkcyBpbiB0aGUgcHVibGlzaGVkIHNlbnRlbmNlcyByZXNwZWN0aXZlbHkgaW4gdGhyZWUgdGltZSBwZXJpb2QuCgojIyMgV29yZGNsb3VkIGZvciB0aW1lIHBlcmlvZCAxCmBgYHtyIHdhcm5pbmc9RkFMU0V9CnNlbnRlbmNlQ29ycHVzMSA8LSBDb3JwdXMoVmVjdG9yU291cmNlKHB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8xJHNlbnRlbmNlX2xvd2VyZWQpKQpzZW50ZW5jZUNvcnB1czEgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzMSwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiIikpCnNlbnRlbmNlQ29ycHVzMSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXMxLCByZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKQpzZW50ZW5jZUNvcnB1czEgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzMSwgcmVtb3ZlUHVuY3R1YXRpb24pCnNlbnRlbmNlQ29ycHVzMSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXMxLCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4MSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoc2VudGVuY2VDb3JwdXMxKQp0ZXJtX21hdHJpeDEgPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeDEsIDAuOTkpCnRlcm1fbWF0cml4MV90aWR5ID0gdGlkeXRleHQ6OnRpZHkodGVybV9tYXRyaXgxKQp0ZXJtX21hdHJpeDFfb3ZlcmFsbD1zdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXgxX3RpZHksIHRlcm0pLCBzdW0oY291bnQpKQp0ZXJtX21hdHJpeDFfcGVyYyA8LSB0ZXJtX21hdHJpeDFfb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQpoZWFkKHRlcm1fbWF0cml4MV9wZXJjLG49MTApCgp3b3JkY2xvdWQodGVybV9tYXRyaXgxX292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeDFfb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCgpgYGAKSXQgY2FuIGJlIHNlZW4gZnJvbSB0aGUgZmlndXJlIHRoYXQgZXhjZXB0IGZvciB0aGUgd29yZHMgdGhhdCBhcmUgdXNlZCBjb21tb25seSBpbiBuZWFybHkgYWxsIGtpbmRzIG9mIHNlbnRlbmNlcyBzdWNoIGFzICJvbmUiLCAid2lsbCIsICJtdXN0IiwgImFsc28iLCB0aGVyZSBhcmUgb3RoZXJzIHdvcmRzIGluY2x1ZGluZyAibWFuIiwgInBlb3BsZSIsICJ0aW1lIiwgIndhdGVyIiwgImFuaW1hbHMiLCBvciAia25vd2xlZGdlIiwgInRydWUiLCAiYm9keSIsICJzb3VsIiBhcHBlYXJpbmcgZnJlcXVlbnRseSByZWZsZWN0aW5nIHNvbWUgZXhhY3QgcXVlc3Rpb25zIHdoaWNoIHdlcmUgdGhvdWdodCBhYm91dC4KCiMjIyBXb3JkY2xvdWQgZm9yIHRpbWUgcGVyaW9kIDIKYGBge3Igd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQojdW5pcXVlKHB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8yJHNjaG9vbCkKCnNlbnRlbmNlQ29ycHVzMiA8LSBDb3JwdXMoVmVjdG9yU291cmNlKHB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8yJHNlbnRlbmNlX2xvd2VyZWQpKQpzZW50ZW5jZUNvcnB1czIgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzMiwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiIikpCnNlbnRlbmNlQ29ycHVzMiA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXMyLCByZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKQpzZW50ZW5jZUNvcnB1czIgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzMiwgcmVtb3ZlUHVuY3R1YXRpb24pCnNlbnRlbmNlQ29ycHVzMiA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXMyLCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4MiA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoc2VudGVuY2VDb3JwdXMyKQp0ZXJtX21hdHJpeDIgPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeDIsIDAuOTkpCnRlcm1fbWF0cml4Ml90aWR5ID0gdGlkeXRleHQ6OnRpZHkodGVybV9tYXRyaXgyKQp0ZXJtX21hdHJpeDJfb3ZlcmFsbD1zdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXgyX3RpZHksIHRlcm0pLCBzdW0oY291bnQpKQp0ZXJtX21hdHJpeDJfcGVyYyA8LSB0ZXJtX21hdHJpeDJfb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQpoZWFkKHRlcm1fbWF0cml4Ml9wZXJjLG49MTApCgp3b3JkY2xvdWQodGVybV9tYXRyaXgyX292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeDJfb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCmBgYApJbiB0aGlzIHRpbWUgcGVyaW9kLCB3aGF0IGludGVyZXN0cyBtZSBtb3N0IGlzIHRoZSBoaWdoIGZyZXF1ZW5jeSBvZiBhcHBlYXJhbmNlIG9mIHRoZSB3b3JkcyAid29tZW4iLCBhbmQgYWxzbyAid29tZW4iLCB3aGljaCB0dXJucyB1cCBldmVuIG1vcmUgb2Z0ZW4gdGhhbiB3b3JkcyAib25lIiwgIndpbGwiLCBvciAiY2FuIi4gQmVzaWRlcywgZXhjZXB0IGZvciB0aGUgd29yZHMgd2UndmUgc2VlbiBpbiB0aGUgbGFzdCBwaWN0dXJlLCB3b3JkcyBzdWNoIGFzICJsb3ZlIiwgImNoaWxkcmVuIiwgImZlbWFsZSIsICJodXNiYW5kIiBhcHBlYXJzIG1vcmUgY29tbW9uLgoKIyMjIFdvcmRjbG91ZCBmb3IgdGltZSBwZXJpb2QgMwpgYGB7ciB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9CnNlbnRlbmNlQ29ycHVzMyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKHB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8zJHNlbnRlbmNlX2xvd2VyZWQpKQpzZW50ZW5jZUNvcnB1czMgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzMywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiIikpCnNlbnRlbmNlQ29ycHVzMyA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXMzLCByZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKQpzZW50ZW5jZUNvcnB1czMgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzMywgcmVtb3ZlUHVuY3R1YXRpb24pCnNlbnRlbmNlQ29ycHVzMyA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXMzLCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4MyA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoc2VudGVuY2VDb3JwdXMzKQp0ZXJtX21hdHJpeDMgPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeDMsIDAuOTkpCnRlcm1fbWF0cml4M190aWR5ID0gdGlkeXRleHQ6OnRpZHkodGVybV9tYXRyaXgzKQp0ZXJtX21hdHJpeDNfb3ZlcmFsbD1zdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXgzX3RpZHksIHRlcm0pLCBzdW0oY291bnQpKQp0ZXJtX21hdHJpeDNfcGVyYyA8LSB0ZXJtX21hdHJpeDNfb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQpoZWFkKHRlcm1fbWF0cml4M19wZXJjLG49MTApCgp3b3JkY2xvdWQodGVybV9tYXRyaXgzX292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeDNfb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCmBgYApBdCB0aGlzIHRpbWUsIHdlIGNhbiBzZWUgdGhhdCBpbiBzdGVhZCBvZiBvbmx5IHNldmVyYWwgd29yZHMgdHVybmluZyB1cCBmcmVxdWVudGx5IHdoaWxlIG90aGVycyByYXJlbHkgYXBwZWFyaW5nLCBtb3JlIHdvcmRzIGJlZ2FuIHRvIGJlIHVzZWQgaW4gdGhlIHNlbnRlbmNlcywgd2hpY2ggbWVhbnMgdGhhdCBtb3JlIGtpbmRzIG9mIHF1ZXN0aW9ucyBiZWdhbiB0byBiZSBkaXNjdXNzZWQgYnkgcGhpbG9zb3BoZXJzIGF0IHRoZSBzYW1lIHRpbWUuIEFuZCB0aGUgd29yZHMgIm5hdHVyZSIsICJyZWFzb24iLCAid29ybGQiLCAiY29uc2Npb3VzbmVzcyIsICJsYWJvdXIiLCAibGF3IiwgIm9yZGVyIiwgImNvbmNlcHQiLCAiZ29kIiwgImxhbmd1YWdlIiBhbmQgYWxzbyAic3lzdGVtIiBwcm92ZSB0aGF0LgoKIyMgUXVlc3Rpb24gMjogV2hldGhlciBkaWZmZXJlbnQgc2Nob29scyBpbiB0aGUgc2FtZSB0aW1lIHBlcmlvZCBhcmUgY29uY2VybmluZyBhYm91dCBzaW1pbGFyIHF1ZXN0aW9ucz8KVG8gbWVhc3VyZSB0aGUgc2ltaWxhcml0eSBvZiB0aGUgcXVlc3Rpb25zIGNvbmNlcm5lZCBhYm91dCBieSB0d28gZGlmZmVyZW50IHNjaG9vbHMsIEkgY2hvb3NlIHRvIG1lYXN1cmUgdGhlIHNpbWlsYXJpdHkgb2YgdGhlIHdvcmRzIHVzZWQgaW4gdGhlIHB1Ymxpc2hlZCBzZW50ZW5jZXMgYnkgdGhlIHNjaG9vbHMuCkFuZCB0byBtZWFzdXJlIHRoZSBzaW1pbGFyaXR5IG9mIHRoZSB3b3JkcyB1c2VkIGJldHdlZW4gdHdvIHNjaG9vbHMsIEkgY2FsY3VsYXRlIEphY2NhcmQgSW5kZXggd2hpY2ggaXMgZGVmaW5lZCBhcyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJzZWN0aW9uIGRpdmlkZWQgYnkgdGhlIHNpemUgb2YgdGhlIHVuaW9uIG9mIHRoZSBzYW1wbGUgc2V0cy4KYGBge3J9CiMjZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIEphY2NhcmQgSW5kZXggYmV0d2VlbiB0d28gZGF0YSBzZXQKIyB0aGUgc2l6ZSBvZiBpbnRlcnNlY3Rpb24Kc2l6ZV9pbnRlcnNlY3Rpb24gPC0gZnVuY3Rpb24oQSxCKXsKICBYIDwtIEEgJT4lCiAgICBpbm5lcl9qb2luKEIsIGJ5ID0gYygidGVybSIgPSAidGVybSIpKQogIG5yb3coWCkKfQoKIyB0aGUgc2l6ZSBvZiB1bmlvbgpzaXplX3VuaW9uIDwtIGZ1bmN0aW9uKEEsQil7CiAgWCA8LUEgJT4lCiAgICBmdWxsX2pvaW4oQiwgYnkgPSBjKCJ0ZXJtIiA9ICJ0ZXJtIikpCiAgbnJvdyhYKQp9CgojSmFjY2FyZCBJbmRleApKSSA8LSBmdW5jdGlvbihBLEIpewogIHNpemVfaW50ZXJzZWN0aW9uKEEsQikvc2l6ZV91bmlvbihBLEIpCn0KYGBgCgpNb3Jlb3ZlciwgdG8gc2VpemUgdGhlIG1ham9yIHF1ZXN0aW9ucyBkaXNjdXNzZWQgYnkgdGhlIHBoaWxvc29waGVycywgSSBjaG9vc2UgdGhlIHdvcmRzIHdoaWNoIGFwcGVhcnMgaW4gdGhlIHNlbnRlbmNlcyBwdWJsaXNoZWQgYnkgb25lIHNjaG9vbCBhdCB0aGUgcGVyY2VudGFnZSBvdmVyIDAuNSUgYXMgdGhlIHNhbXBsZXMsIGRlcGVuZGluZyBvbiB3aGljaCB3ZSBjYWxjdWxhdGUgdGhlIEphY2NhcmQgSW5kZXguCgojIyMgVGltZSBwZXJpb2QgMQpGaXJzdCwgd2UgaGF2ZSBhIHF1aWNrIGxvb2sgb2YgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGFtb3VudCBvZiBzZW50ZW5jZXMgcHVibGlzaGVkIGJ5IGRpZmZlcmVudCBzY2hvb2xzIGluIHRpbWUgcGVyaW9kIDEuCgojIyMjIFBlcmNlbnRhZ2Ugb2YgdGhlIGFtb3VudCBvZiBzZW50ZW5jZXMgcHVibGlzaGVkIGJ5IGRpZmZlcmVudCBzY2hvb2xzIGluIHRpbWUgcGVyaW9kIDEKYGBge3IsIGVjaG89RkFMU0V9CmNvdW50X29mX2RpZmZlcmVudF9zY2hvb2xfMSA8LSBwdWJsaXNoX2RhdGVfY2xhc3NpZnlfMSAlPiUKICBncm91cF9ieShzY2hvb2wpICU+JQogIHN1bW1hcml6ZShjb3VudF9zY2hvb2wgPSBuKCkpICU+JQogIGFycmFuZ2UoZGVzYyhjb3VudF9zY2hvb2wpKQoKcGVyY19vZl9kaWZmZXJlbnRfc2Nob29sXzEgPC0gY291bnRfb2ZfZGlmZmVyZW50X3NjaG9vbF8xICU+JQogIG11dGF0ZShzdW0gPSBzdW0oY291bnRfc2Nob29sKSkgJT4lCiAgbXV0YXRlKHBlcmNlbnQgPSBjb3VudF9zY2hvb2wvc3VtKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IHBhc3RlMChmb3JtYXQocGVyY2VudCoxMDAsIGRpZ2l0cyA9IDIpLCAiJSIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KHNjaG9vbCwgY291bnRfc2Nob29sLCBwZXJjZW50KQpwZXJjX29mX2RpZmZlcmVudF9zY2hvb2xfMQoKcGVyY19vZl9kaWZmZXJlbnRfc2Nob29sX2ZpZ18xIDwtIHBlcmNfb2ZfZGlmZmVyZW50X3NjaG9vbF8xICU+JQogIGdncGxvdChhZXMoeD0iIiwgeT1wZXJjZW50LCBmaWxsPXNjaG9vbCkpKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpKwogIGxhYnMoeD0iIiwgCiAgICAgICB5PSIiLCAKICAgICAgIHRpdGxlPSJUaGUgcGVyY2VudGFnZSBvZiB0aGUgYW1vdW50IG9mIHNlbnRlbmNlcyBwdWJsaXNoZWQgCiAgICAgICBieSBlYWNoIHNjaG9vbCBpbiB0aW1lIHBlcmlvZCAxIikrCiAgdGhlbWUoYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpCnBlcmNfb2ZfZGlmZmVyZW50X3NjaG9vbF9maWdfMQpgYGAKV2UgY2FuIHNlZSB0aGVyZSBhcmUgdGhyZWUgbWFqb3Igc2Nob29scyBpbmNsdWRpbmcgQXJpc3RvdGxlLCBEYW9pc20gYW5kIFBsYXRvIGF0IHRoaXMgdGltZS4KClRoZW4sIGxldCdzIGNoZWNrIHRoZSB3b3JkcyB1c2VkIHJlc3BlY3RpdmVseSBpbiB0aGUgMyBzY2hvb2xzLiAKCiMjIyMgV29yZHMgdXNlZCByZXNwZWN0aXZlbHkgaW4gdGhlIDMgc2Nob29scyBpbiB0aW1lIHBlcmlvZCAxCgojIyMjIyBBcmlzdG90bGUKYGBge3Igd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQphcmlzdG90bGUgPC0gcHVibGlzaF9kYXRlX2NsYXNzaWZ5XzEgJT4lCiAgZmlsdGVyKHNjaG9vbCA9PSAiYXJpc3RvdGxlIikKCnNlbnRlbmNlQ29ycHVzX2FyaXN0b3RsZSA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGFyaXN0b3RsZSRzZW50ZW5jZV9sb3dlcmVkKSkKc2VudGVuY2VDb3JwdXNfYXJpc3RvdGxlIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19hcmlzdG90bGUsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoIiIpKQpzZW50ZW5jZUNvcnB1c19hcmlzdG90bGUgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2FyaXN0b3RsZSwgcmVtb3ZlV29yZHMsIGNoYXJhY3RlcigwKSkKc2VudGVuY2VDb3JwdXNfYXJpc3RvdGxlIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19hcmlzdG90bGUsIHJlbW92ZVB1bmN0dWF0aW9uKQpzZW50ZW5jZUNvcnB1c19hcmlzdG90bGUgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2FyaXN0b3RsZSwgc3RyaXBXaGl0ZXNwYWNlKQp0ZXJtX21hdHJpeF9hcmlzdG90bGUgPC0gVGVybURvY3VtZW50TWF0cml4KHNlbnRlbmNlQ29ycHVzX2FyaXN0b3RsZSkKdGVybV9tYXRyaXhfYXJpc3RvdGxlID0gcmVtb3ZlU3BhcnNlVGVybXModGVybV9tYXRyaXhfYXJpc3RvdGxlLCAwLjk5KQp0ZXJtX21hdHJpeF9hcmlzdG90bGVfdGlkeSA9IHRpZHl0ZXh0Ojp0aWR5KHRlcm1fbWF0cml4X2FyaXN0b3RsZSkKdGVybV9tYXRyaXhfYXJpc3RvdGxlX292ZXJhbGwgPSBzdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXhfYXJpc3RvdGxlX3RpZHksIHRlcm0pLCBzdW0oY291bnQpKQoKd29yZGNsb3VkKHRlcm1fbWF0cml4X2FyaXN0b3RsZV9vdmVyYWxsJHRlcm0sdGVybV9tYXRyaXhfYXJpc3RvdGxlX292ZXJhbGwkYHN1bShjb3VudClgLG1pbi5mcmVxPTkuNSxjb2w9YnJld2VyLnBhbCg4LCJEYXJrMiIpLHJvdC5wZXI9MC4zKQoKdGVybV9tYXRyaXhfYXJpc3RvdGxlX3BlcmMgPC0gdGVybV9tYXRyaXhfYXJpc3RvdGxlX292ZXJhbGwgJT4lCiAgbXV0YXRlKHBlcmMgPSBgc3VtKGNvdW50KWAvc3VtKGBzdW0oY291bnQpYCkpICU+JQogIGFycmFuZ2UoZGVzYyhwZXJjKSkKCnNhbXBsZV9hcmlzdG90bGUgPC0gdGVybV9tYXRyaXhfYXJpc3RvdGxlX3BlcmMgJT4lCiAgZmlsdGVyKHBlcmMgPj0gMC4wMDUpCmhlYWQoc2FtcGxlX2FyaXN0b3RsZSxuPTEwKQpgYGAKIyMjIyMgUGxhdG8KYGBge3Igd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQpwbGF0byA8LSBwdWJsaXNoX2RhdGVfY2xhc3NpZnlfMSAlPiUKICBmaWx0ZXIoc2Nob29sID09ICJwbGF0byIpCgpzZW50ZW5jZUNvcnB1c19wbGF0byA8LSBDb3JwdXMoVmVjdG9yU291cmNlKHBsYXRvJHNlbnRlbmNlX2xvd2VyZWQpKQpzZW50ZW5jZUNvcnB1c19wbGF0byA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfcGxhdG8sIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoIiIpKQpzZW50ZW5jZUNvcnB1c19wbGF0byA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfcGxhdG8sIHJlbW92ZVdvcmRzLCBjaGFyYWN0ZXIoMCkpCnNlbnRlbmNlQ29ycHVzX3BsYXRvIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19wbGF0bywgcmVtb3ZlUHVuY3R1YXRpb24pCnNlbnRlbmNlQ29ycHVzX3BsYXRvIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19wbGF0bywgc3RyaXBXaGl0ZXNwYWNlKQp0ZXJtX21hdHJpeF9wbGF0byA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoc2VudGVuY2VDb3JwdXNfcGxhdG8pCnRlcm1fbWF0cml4X3BsYXRvID0gcmVtb3ZlU3BhcnNlVGVybXModGVybV9tYXRyaXhfcGxhdG8sIDAuOTkpCnRlcm1fbWF0cml4X3BsYXRvX3RpZHkgPSB0aWR5dGV4dDo6dGlkeSh0ZXJtX21hdHJpeF9wbGF0bykKdGVybV9tYXRyaXhfcGxhdG9fb3ZlcmFsbCA9IHN1bW1hcmlzZShncm91cF9ieSh0ZXJtX21hdHJpeF9wbGF0b190aWR5LCB0ZXJtKSwgc3VtKGNvdW50KSkKI3Rlcm1fbWF0cml4X3BsYXRvX292ZXJhbGwKCndvcmRjbG91ZCh0ZXJtX21hdHJpeF9wbGF0b19vdmVyYWxsJHRlcm0sdGVybV9tYXRyaXhfcGxhdG9fb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCgp0ZXJtX21hdHJpeF9wbGF0b19wZXJjIDwtIHRlcm1fbWF0cml4X3BsYXRvX292ZXJhbGwgJT4lCiAgbXV0YXRlKHBlcmMgPSBgc3VtKGNvdW50KWAvc3VtKGBzdW0oY291bnQpYCkpICU+JQogIGFycmFuZ2UoZGVzYyhwZXJjKSkKCnNhbXBsZV9wbGF0byA8LSB0ZXJtX21hdHJpeF9wbGF0b19wZXJjICU+JQogIGZpbHRlcihwZXJjID49IDAuMDA1KQpoZWFkKHNhbXBsZV9wbGF0bywgbj0xMCkKYGBgCgojIyMjIyBEYW9pc20KYGBge3Igd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQpkYW9pc20gPC0gZGF0YSAlPiUKICBmaWx0ZXIoc2Nob29sID09ICJEYW9pc20iKQoKc2VudGVuY2VDb3JwdXNfZGFvaXNtIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoZGFvaXNtJHNlbnRlbmNlX3N0cikpCnNlbnRlbmNlQ29ycHVzX2Rhb2lzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfZGFvaXNtLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCIiKSkKc2VudGVuY2VDb3JwdXNfZGFvaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19kYW9pc20sIHJlbW92ZVdvcmRzLCBjaGFyYWN0ZXIoMCkpCnNlbnRlbmNlQ29ycHVzX2Rhb2lzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfZGFvaXNtLCByZW1vdmVQdW5jdHVhdGlvbikKc2VudGVuY2VDb3JwdXNfZGFvaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19kYW9pc20sIHN0cmlwV2hpdGVzcGFjZSkKdGVybV9tYXRyaXhfZGFvaXNtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChzZW50ZW5jZUNvcnB1c19kYW9pc20pCnRlcm1fbWF0cml4X2Rhb2lzbSA9IHJlbW92ZVNwYXJzZVRlcm1zKHRlcm1fbWF0cml4X2Rhb2lzbSwgMC45OSkKdGVybV9tYXRyaXhfZGFvaXNtX3RpZHkgPSB0aWR5dGV4dDo6dGlkeSh0ZXJtX21hdHJpeF9kYW9pc20pCnRlcm1fbWF0cml4X2Rhb2lzbV9vdmVyYWxsID0gc3VtbWFyaXNlKGdyb3VwX2J5KHRlcm1fbWF0cml4X2Rhb2lzbV90aWR5LCB0ZXJtKSwgc3VtKGNvdW50KSkKI3Rlcm1fbWF0cml4X2Rhb2lzbV9vdmVyYWxsCgp3b3JkY2xvdWQodGVybV9tYXRyaXhfZGFvaXNtX292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeF9kYW9pc21fb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCgp0ZXJtX21hdHJpeF9kYW9pc21fcGVyYyA8LSB0ZXJtX21hdHJpeF9kYW9pc21fb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQojdGVybV9tYXRyaXhfZGFvaXNtX3BlcmMKCnNhbXBsZV9kYW9pc20gPC0gdGVybV9tYXRyaXhfZGFvaXNtX3BlcmMgJT4lCiAgZmlsdGVyKHBlcmMgPj0gMC4wMDUpCmhlYWQoc2FtcGxlX2Rhb2lzbSwgbj0xMCkKYGBgCldlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgbW9yZSBkaWZmZXJlbnQgd29yZHMgdXNlZCBpbiBEYW9pc20gc3VjaCBhcyAidHp1IiBvciAidGFvIiwgYW5kIHRoaXMgaXMgYmVjYXVzZSBEYW9pc20gb3JpZ2lucyBpbiBDaGluYSwgYW5kIHRoZSBzZW50ZW5jZXMgYXJlIGFsd2F5cyBsaWtlICJUenUgc2FpZC4uLiIuCgojIyMjIyBDb21wYXJpc2lvbiBiZXR3ZWVuIHRoZSBzY2hvb2xzIGluIHRpbWUgcGVyaW9kIDEKV2UgY2FsY3VsYXRlIEphY2NhcmQgSW5kZXggYW5kIGhhdmUgdGhlIHJlc3VsdHM6CmBgYHtyLGVjaG89RkFMU0V9CnRpbWVfcGVyaW9kXzEgPC0gbGlzdChhcmlzdG90bGUgPSBzYW1wbGVfYXJpc3RvdGxlLAogICAgICAgICAgICAgICAgICAgICAgcGxhdG8gPSBzYW1wbGVfcGxhdG8sCiAgICAgICAgICAgICAgICAgICAgICBkYW9pc20gPSBzYW1wbGVfZGFvaXNtKQpKSTEgPC0gYXJyYXkoMCwgZGltID0gYygzLDMpKQpmb3IoaSBpbiAxOjMpewogIGZvcihqIGluIDE6Myl7CiAgSkkxW2ksal0gPSBKSSh0aW1lX3BlcmlvZF8xW1tpXV0sdGltZV9wZXJpb2RfMVtbal1dKQogIH0KfQpjb2xuYW1lcyhKSTEpIDwtIGMoImFyaXN0b3RsZSIsInBsYXRvIiwiZGFvaXNtIikKcm93bmFtZXMoSkkxKSA8LSBjKCJhcmlzdG90bGUiLCJwbGF0byIsImRhb2lzbSIpCkpJMQoKY29ycnBsb3QoSkkxLCBkaWFnID0gRkFMU0UpCgpgYGAKV2UgY2FuIHNlZSB0aGF0IEFyaXN0b3RsZSBhbmQgUGxhdG8gaGF2ZSBsYXJnZXIgSmFjY2FyZCBJbmRleCwgd2hpbGUgRGFvaXNtIGlzIGxlc3Mgc2ltaWxhciB0byBib3RoIG9mIHRoZW0uIFRoaXMgY2FuIGJlIGVhc2lseSB1bmRlcnN0b29kIGJlY2F1c2UgUGxhdG8gaXMgQXJpc3RvdGxlJ3MgdGVhY2hlciBhbmQgUGxhdG8gcGhpbG9zb3BoeSBhbmQgQXJpc3RvdGxlIHBoaWxvc29waHkgaGF2ZSB0aGUgc2FtZSBvcmlnaW4gZXZlbiB0aG91Z2ggdGhleSBoYXZlIGRpZmZlcmVudCB0aG91Z2h0cy4gSG93ZXZlciwgRGFvaXNtIGNvbWVzIGZyb20gYSB0b3RhbGx5IGRpZmZlcmVudCBjdWx0dXJlLgoKIyMjIFRpbWUgcGVyaW9kIDIKU2FtZSBhcyB3aGF0IHdlIGRpZCBpbiB0aGUgcHJldmlvdXMgc3RlcCwgd2UgZmlyc3QgY2hlY2sgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGFtb3VudCBvZiBzZW50ZW5jZXMgcHVibGlzaGVkIGJ5IGRpZmZlcmVudCBzY2hvb2xzIGluIHRoaXMgdGltZSBwZXJpb2QuCgojIyMjIFBlcmNlbnRhZ2Ugb2YgdGhlIGFtb3VudCBvZiBzZW50ZW5jZXMgcHVibGlzaGVkIGJ5IGRpZmZlcmVudCBzY2hvb2xzIGluIHRpbWUgcGVyaW9kIDIKYGBge3IsZWNobz1GQUxTRX0KY291bnRfb2ZfZGlmZmVyZW50X3NjaG9vbF8yIDwtIHB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8yICU+JQogIGdyb3VwX2J5KHNjaG9vbCkgJT4lCiAgc3VtbWFyaXplKGNvdW50X3NjaG9vbCA9IG4oKSkgJT4lCiAgYXJyYW5nZShkZXNjKGNvdW50X3NjaG9vbCkpCgpwZXJjX29mX2RpZmZlcmVudF9zY2hvb2xfMiA8LSBjb3VudF9vZl9kaWZmZXJlbnRfc2Nob29sXzIgJT4lCiAgbXV0YXRlKHN1bSA9IHN1bShjb3VudF9zY2hvb2wpKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IGNvdW50X3NjaG9vbC9zdW0pICU+JQogIG11dGF0ZShwZXJjZW50ID0gcGFzdGUwKGZvcm1hdChwZXJjZW50KjEwMCwgZGlnaXRzID0gMiksICIlIikpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2Nob29sLCBjb3VudF9zY2hvb2wsIHBlcmNlbnQpCnBlcmNfb2ZfZGlmZmVyZW50X3NjaG9vbF8yCgpwZXJjX29mX2RpZmZlcmVudF9zY2hvb2xfZmlnXzIgPC0gcGVyY19vZl9kaWZmZXJlbnRfc2Nob29sXzIgJT4lCiAgZ2dwbG90KGFlcyh4PSIiLCB5PXBlcmNlbnQsIGZpbGw9c2Nob29sKSkrCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSsKICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikrCiAgbGFicyh4PSIiLCAKICAgICAgIHk9IiIsIAogICAgICAgdGl0bGU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSBhbW91bnQgb2Ygc2VudGVuY2VzIHB1Ymxpc2hlZCAKICAgICAgIGJ5IGVhY2ggc2Nob29sIGluIHRpbWUgcGVyaW9kIDIiKSsKICB0aGVtZShheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkKcGVyY19vZl9kaWZmZXJlbnRfc2Nob29sX2ZpZ18yCmBgYApXZSBjYW4gc2VlIHRoYXQgdGhlcmUgYXJlIG9ubHkgdHdvIG1ham95IHBoaWxvc29waHkgc2Nob29scyBhdCB0aGlzIHRpbWU6IFNjaG9sYXN0aWNpc20gYW5kIFN0b2ljaXNtLgoKTmV4dCwgY2hlY2sgdGhlIHdvcmRzIHVzZWQgcmVzcGVjdGl2ZWx5IGluIHRoZSAyIHNjaG9vbHMuCgoKIyMjIyBXb3JkcyB1c2VkIGluIHRoZSAyIHNjaG9vbHMgaW4gdGltZSBwZXJpb2QgMgoKIyMjIyMgU2Nob2xhc3RpY2lzbQpgYGB7ciB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9CnNjaG9sYXN0aWNpc20gPC0gcHVibGlzaF9kYXRlX2NsYXNzaWZ5XzIgJT4lCiAgZmlsdGVyKHNjaG9vbCA9PSAic2Nob2xhc3RpY2lzbSIpCgpzZW50ZW5jZUNvcnB1c19zY2hvbGFzdGljaXNtIDwtIENvcnB1cyhWZWN0b3JTb3VyY2Uoc2Nob2xhc3RpY2lzbSRzZW50ZW5jZV9sb3dlcmVkKSkKc2VudGVuY2VDb3JwdXNfc2Nob2xhc3RpY2lzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfc2Nob2xhc3RpY2lzbSwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiIikpCnNlbnRlbmNlQ29ycHVzX3NjaG9sYXN0aWNpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX3NjaG9sYXN0aWNpc20sIHJlbW92ZVdvcmRzLCBjaGFyYWN0ZXIoMCkpCnNlbnRlbmNlQ29ycHVzX3NjaG9sYXN0aWNpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX3NjaG9sYXN0aWNpc20sIHJlbW92ZVB1bmN0dWF0aW9uKQpzZW50ZW5jZUNvcnB1c19zY2hvbGFzdGljaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19zY2hvbGFzdGljaXNtLCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4X3NjaG9sYXN0aWNpc20gPC0gVGVybURvY3VtZW50TWF0cml4KHNlbnRlbmNlQ29ycHVzX3NjaG9sYXN0aWNpc20pCnRlcm1fbWF0cml4X3NjaG9sYXN0aWNpc20gPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeF9zY2hvbGFzdGljaXNtLCAwLjk5KQp0ZXJtX21hdHJpeF9zY2hvbGFzdGljaXNtX3RpZHkgPSB0aWR5dGV4dDo6dGlkeSh0ZXJtX21hdHJpeF9zY2hvbGFzdGljaXNtKQp0ZXJtX21hdHJpeF9zY2hvbGFzdGljaXNtX292ZXJhbGwgPSBzdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXhfc2Nob2xhc3RpY2lzbV90aWR5LCB0ZXJtKSwgc3VtKGNvdW50KSkKI3Rlcm1fbWF0cml4X3NjaG9sYXN0aWNpc21fb3ZlcmFsbAoKd29yZGNsb3VkKHRlcm1fbWF0cml4X3NjaG9sYXN0aWNpc21fb3ZlcmFsbCR0ZXJtLHRlcm1fbWF0cml4X3NjaG9sYXN0aWNpc21fb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCgp0ZXJtX21hdHJpeF9zY2hvbGFzdGljaXNtX3BlcmMgPC0gdGVybV9tYXRyaXhfc2Nob2xhc3RpY2lzbV9vdmVyYWxsICU+JQogIG11dGF0ZShwZXJjID0gYHN1bShjb3VudClgL3N1bShgc3VtKGNvdW50KWApKSAlPiUKICBhcnJhbmdlKGRlc2MocGVyYykpCiN0ZXJtX21hdHJpeF9zY2hvbGFzdGljaXNtX3BlcmMKCnNhbXBsZV9zY2hvbGFzdGljaXNtIDwtIHRlcm1fbWF0cml4X3NjaG9sYXN0aWNpc21fcGVyYyAlPiUKICBmaWx0ZXIocGVyYyA+PSAwLjAwNSkKaGVhZChzYW1wbGVfc2Nob2xhc3RpY2lzbSxuPTEwKQpgYGAKCiMjIyMjIFN0b2ljaXNtCmBgYHtyIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRX0Kc3RvaWNpc20gPC0gcHVibGlzaF9kYXRlX2NsYXNzaWZ5XzIgJT4lCiAgZmlsdGVyKHNjaG9vbCA9PSAic3RvaWNpc20iKQoKc2VudGVuY2VDb3JwdXNfc3RvaWNpc20gPC0gQ29ycHVzKFZlY3RvclNvdXJjZShzdG9pY2lzbSRzZW50ZW5jZV9sb3dlcmVkKSkKc2VudGVuY2VDb3JwdXNfc3RvaWNpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX3N0b2ljaXNtLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCIiKSkKc2VudGVuY2VDb3JwdXNfc3RvaWNpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX3N0b2ljaXNtLCByZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKQpzZW50ZW5jZUNvcnB1c19zdG9pY2lzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfc3RvaWNpc20sIHJlbW92ZVB1bmN0dWF0aW9uKQpzZW50ZW5jZUNvcnB1c19zdG9pY2lzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfc3RvaWNpc20sIHN0cmlwV2hpdGVzcGFjZSkKdGVybV9tYXRyaXhfc3RvaWNpc20gPC0gVGVybURvY3VtZW50TWF0cml4KHNlbnRlbmNlQ29ycHVzX3N0b2ljaXNtKQp0ZXJtX21hdHJpeF9zdG9pY2lzbSA9IHJlbW92ZVNwYXJzZVRlcm1zKHRlcm1fbWF0cml4X3N0b2ljaXNtLCAwLjk5KQp0ZXJtX21hdHJpeF9zdG9pY2lzbV90aWR5ID0gdGlkeXRleHQ6OnRpZHkodGVybV9tYXRyaXhfc3RvaWNpc20pCnRlcm1fbWF0cml4X3N0b2ljaXNtX292ZXJhbGwgPSBzdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXhfc3RvaWNpc21fdGlkeSwgdGVybSksIHN1bShjb3VudCkpCiN0ZXJtX21hdHJpeF9zdG9pY2lzbV9vdmVyYWxsCgp3b3JkY2xvdWQodGVybV9tYXRyaXhfc3RvaWNpc21fb3ZlcmFsbCR0ZXJtLHRlcm1fbWF0cml4X3N0b2ljaXNtX292ZXJhbGwkYHN1bShjb3VudClgLG1pbi5mcmVxPTkuNSxjb2w9YnJld2VyLnBhbCg4LCJEYXJrMiIpLHJvdC5wZXI9MC4zKQoKdGVybV9tYXRyaXhfc3RvaWNpc21fcGVyYyA8LSB0ZXJtX21hdHJpeF9zdG9pY2lzbV9vdmVyYWxsICU+JQogIG11dGF0ZShwZXJjID0gYHN1bShjb3VudClgL3N1bShgc3VtKGNvdW50KWApKSAlPiUKICBhcnJhbmdlKGRlc2MocGVyYykpCiN0ZXJtX21hdHJpeF9zdG9pY2lzbV9wZXJjCgpzYW1wbGVfc3RvaWNpc20gPC0gdGVybV9tYXRyaXhfc3RvaWNpc21fcGVyYyAlPiUKICBmaWx0ZXIocGVyYyA+PSAwLjAwNSkKaGVhZChzYW1wbGVfc3RvaWNpc20sbj0xMCkKYGBgCgojIyMjIyBDb21wYXJpc2lvbiBiZXR3ZWVuIHRoZSBzY2hvb2xzIGluIHRpbWUgcGVyaW9kIDIKYGBge3IsZWNobz1GQUxTRX0KI2NvbXBhcmlzaW9uIGJldHdlZW4gU2Nob2xhc3RpY2lzbSBhbmQgU3RvaWNpc20KdGltZV9wZXJpb2RfMiA8LSBsaXN0KHNjaG9sYXN0aWNpc20gPSBzYW1wbGVfc2Nob2xhc3RpY2lzbSwKICAgICAgICAgICAgICAgICAgICAgIHN0b2ljaXNtID0gc2FtcGxlX3N0b2ljaXNtKQpKSTIgPC0gYXJyYXkoMCwgZGltID0gYygyLDIpKQpmb3IoaSBpbiAxOjIpewogIGZvcihqIGluIDE6Mil7CiAgSkkyW2ksal0gPSBKSSh0aW1lX3BlcmlvZF8yW1tpXV0sdGltZV9wZXJpb2RfMltbal1dKQogIH0KfQpjb2xuYW1lcyhKSTIpIDwtIGMoInNjaG9sYXN0aWNpc20iLCJzdG9pY2lzbSIpCnJvd25hbWVzKEpJMikgPC0gYygic2Nob2xhc3RpY2lzbSIsInN0b2ljaXNtIikKSkkyCgpjb3JycGxvdChKSTIsIGRpYWcgPSBGQUxTRSkKYGBgCkl0IGNhbiBiZSBzZWVuIHRoYXQgdGhlIEphY2NhcmQgSW5kZXggYmV0d2VlbiB0d28gc2Nob29scyBpcyAwLjIzLgoKIyMjIFRpbWUgcGVyaW9kIDMKU2FtZSBhcyB3aGF0IHdlIGRpZCBpbiB0aGUgcHJldmlvdXMgc3RlcCwgd2UgZmlyc3QgY2hlY2sgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGFtb3VudCBvZiBzZW50ZW5jZXMgcHVibGlzaGVkIGJ5IGRpZmZlcmVudCBzY2hvb2xzIGluIHRoaXMgdGltZSBwZXJpb2QuCgojIyMjIFBlcmNlbnRhZ2Ugb2YgdGhlIGFtb3VudCBvZiBzZW50ZW5jZXMgcHVibGlzaGVkIGJ5IGRpZmZlcmVudCBzY2hvb2xzIGluIHRpbWUgcGVyaW9kIDMKYGBge3Igd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KY291bnRfb2ZfZGlmZmVyZW50X3NjaG9vbF8zIDwtIHB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8zICU+JQogIGdyb3VwX2J5KHNjaG9vbCkgJT4lCiAgc3VtbWFyaXplKGNvdW50X3NjaG9vbCA9IG4oKSkgJT4lCiAgYXJyYW5nZShkZXNjKGNvdW50X3NjaG9vbCkpCgpwZXJjX29mX2RpZmZlcmVudF9zY2hvb2xfMyA8LSBjb3VudF9vZl9kaWZmZXJlbnRfc2Nob29sXzMgJT4lCiAgbXV0YXRlKHN1bSA9IHN1bShjb3VudF9zY2hvb2wpKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IGNvdW50X3NjaG9vbC9zdW0pICU+JQogIG11dGF0ZShwZXJjZW50ID0gcGFzdGUwKGZvcm1hdChwZXJjZW50KjEwMCwgZGlnaXRzID0gMiksICIlIikpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2Nob29sLCBjb3VudF9zY2hvb2wsIHBlcmNlbnQpCnBlcmNfb2ZfZGlmZmVyZW50X3NjaG9vbF8zCgpwZXJjX29mX2RpZmZlcmVudF9zY2hvb2xfZmlnXzMgPC0gcGVyY19vZl9kaWZmZXJlbnRfc2Nob29sXzMgJT4lCiAgZ2dwbG90KGFlcyh4PSIiLCB5PXBlcmNlbnQsIGZpbGw9c2Nob29sKSkrCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSsKICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikrCiAgbGFicyh4PSIiLCAKICAgICAgIHk9IiIsIAogICAgICAgdGl0bGU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSBhbW91bnQgb2Ygc2VudGVuY2VzIHB1Ymxpc2hlZCBieSAKICAgICAgIGVhY2ggc2Nob29sIGluIHRpbWUgcGVyaW9kIDMiKSsKICB0aGVtZShheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkKcGVyY19vZl9kaWZmZXJlbnRfc2Nob29sX2ZpZ18zCmBgYApBcyBpcyBzaG93biwgdGhlIGFtb3VudCBvZiBzY2hvb2xzIGxpdmluZyBpbiB0aGlzIHRpbWUgcGVyaW9kIHJlYWNoZXMgMTMuCkFuZCB3ZSBjaGVjayB0aGUgd29yZHMgdXNlZCBieSB0aGVtIGFuZCBjYWxjdWxhdGUgdGhlIEphY2NhcmQgSW5kZXggdG8gZGVyaXZlIHRoZSBzaW1pbGFyaXR5LgoKIyMjIyBXb3JkcyB1c2VkIGluIHRoZSAxMyBzY2hvb2xzIGluIHRpbWUgcGVyaW9kIDMKCiMjIyMjIEFuYWx5dGljCmBgYHtyIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRX0KYW5hbHl0aWMgPC0gcHVibGlzaF9kYXRlX2NsYXNzaWZ5XzMgJT4lCiAgZmlsdGVyKHNjaG9vbCA9PSAiYW5hbHl0aWMiKQoKc2VudGVuY2VDb3JwdXNfYW5hbHl0aWMgPC0gQ29ycHVzKFZlY3RvclNvdXJjZShhbmFseXRpYyRzZW50ZW5jZV9sb3dlcmVkKSkKc2VudGVuY2VDb3JwdXNfYW5hbHl0aWMgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2FuYWx5dGljLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCIiKSkKc2VudGVuY2VDb3JwdXNfYW5hbHl0aWMgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2FuYWx5dGljLCByZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKQpzZW50ZW5jZUNvcnB1c19hbmFseXRpYyA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfYW5hbHl0aWMsIHJlbW92ZVB1bmN0dWF0aW9uKQpzZW50ZW5jZUNvcnB1c19hbmFseXRpYyA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfYW5hbHl0aWMsIHN0cmlwV2hpdGVzcGFjZSkKdGVybV9tYXRyaXhfYW5hbHl0aWMgPC0gVGVybURvY3VtZW50TWF0cml4KHNlbnRlbmNlQ29ycHVzX2FuYWx5dGljKQp0ZXJtX21hdHJpeF9hbmFseXRpYyA9IHJlbW92ZVNwYXJzZVRlcm1zKHRlcm1fbWF0cml4X2FuYWx5dGljLCAwLjk5KQp0ZXJtX21hdHJpeF9hbmFseXRpY190aWR5ID0gdGlkeXRleHQ6OnRpZHkodGVybV9tYXRyaXhfYW5hbHl0aWMpCnRlcm1fbWF0cml4X2FuYWx5dGljX292ZXJhbGwgPSBzdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXhfYW5hbHl0aWNfdGlkeSwgdGVybSksIHN1bShjb3VudCkpCiN0ZXJtX21hdHJpeF9hbmFseXRpY19vdmVyYWxsCgojd29yZGNsb3VkKHRlcm1fbWF0cml4X2FuYWx5dGljX292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeF9hbmFseXRpY19vdmVyYWxsJGBzdW0oY291bnQpYCxtaW4uZnJlcT05LjUsY29sPWJyZXdlci5wYWwoOCwiRGFyazIiKSxyb3QucGVyPTAuMykKCnRlcm1fbWF0cml4X2FuYWx5dGljX3BlcmMgPC0gdGVybV9tYXRyaXhfYW5hbHl0aWNfb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQojdGVybV9tYXRyaXhfYW5hbHl0aWNfcGVyYwoKc2FtcGxlX2FuYWx5dGljIDwtIHRlcm1fbWF0cml4X2FuYWx5dGljX3BlcmMgJT4lCiAgZmlsdGVyKHBlcmMgPj0gMC4wMDUpCmhlYWQoc2FtcGxlX2FuYWx5dGljLG49MTApCmBgYAojIyMjIyBDYXBpdGFsaXNtCmBgYHtyIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRX0KY2FwaXRhbGlzbSA8LSBwdWJsaXNoX2RhdGVfY2xhc3NpZnlfMyAlPiUKICBmaWx0ZXIoc2Nob29sID09ICJjYXBpdGFsaXNtIikKCnNlbnRlbmNlQ29ycHVzX2NhcGl0YWxpc20gPC0gQ29ycHVzKFZlY3RvclNvdXJjZShjYXBpdGFsaXNtJHNlbnRlbmNlX2xvd2VyZWQpKQpzZW50ZW5jZUNvcnB1c19jYXBpdGFsaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19jYXBpdGFsaXNtLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCIiKSkKc2VudGVuY2VDb3JwdXNfY2FwaXRhbGlzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfY2FwaXRhbGlzbSwgcmVtb3ZlV29yZHMsIGNoYXJhY3RlcigwKSkKc2VudGVuY2VDb3JwdXNfY2FwaXRhbGlzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfY2FwaXRhbGlzbSwgcmVtb3ZlUHVuY3R1YXRpb24pCnNlbnRlbmNlQ29ycHVzX2NhcGl0YWxpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2NhcGl0YWxpc20sIHN0cmlwV2hpdGVzcGFjZSkKdGVybV9tYXRyaXhfY2FwaXRhbGlzbSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoc2VudGVuY2VDb3JwdXNfY2FwaXRhbGlzbSkKdGVybV9tYXRyaXhfY2FwaXRhbGlzbSA9IHJlbW92ZVNwYXJzZVRlcm1zKHRlcm1fbWF0cml4X2NhcGl0YWxpc20sIDAuOTkpCnRlcm1fbWF0cml4X2NhcGl0YWxpc21fdGlkeSA9IHRpZHl0ZXh0Ojp0aWR5KHRlcm1fbWF0cml4X2NhcGl0YWxpc20pCnRlcm1fbWF0cml4X2NhcGl0YWxpc21fb3ZlcmFsbCA9IHN1bW1hcmlzZShncm91cF9ieSh0ZXJtX21hdHJpeF9jYXBpdGFsaXNtX3RpZHksIHRlcm0pLCBzdW0oY291bnQpKQojdGVybV9tYXRyaXhfY2FwaXRhbGlzbV9vdmVyYWxsCgojd29yZGNsb3VkKHRlcm1fbWF0cml4X2NhcGl0YWxpc21fb3ZlcmFsbCR0ZXJtLHRlcm1fbWF0cml4X2NhcGl0YWxpc21fb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCgp0ZXJtX21hdHJpeF9jYXBpdGFsaXNtX3BlcmMgPC0gdGVybV9tYXRyaXhfY2FwaXRhbGlzbV9vdmVyYWxsICU+JQogIG11dGF0ZShwZXJjID0gYHN1bShjb3VudClgL3N1bShgc3VtKGNvdW50KWApKSAlPiUKICBhcnJhbmdlKGRlc2MocGVyYykpCiN0ZXJtX21hdHJpeF9jYXBpdGFsaXNtX3BlcmMKCnNhbXBsZV9jYXBpdGFsaXNtIDwtIHRlcm1fbWF0cml4X2NhcGl0YWxpc21fcGVyYyAlPiUKICBmaWx0ZXIocGVyYyA+PSAwLjAwNSkKaGVhZChzYW1wbGVfY2FwaXRhbGlzbSxuPTEwKQpgYGAKIyMjIyMgRW1waXJpY2lzbQpgYGB7ciB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9CmVtcGlyaWNpc20gPC0gcHVibGlzaF9kYXRlX2NsYXNzaWZ5XzMgJT4lCiAgZmlsdGVyKHNjaG9vbCA9PSAiZW1waXJpY2lzbSIpCgpzZW50ZW5jZUNvcnB1c19lbXBpcmljaXNtIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoZW1waXJpY2lzbSRzZW50ZW5jZV9sb3dlcmVkKSkKc2VudGVuY2VDb3JwdXNfZW1waXJpY2lzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfZW1waXJpY2lzbSwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiIikpCnNlbnRlbmNlQ29ycHVzX2VtcGlyaWNpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2VtcGlyaWNpc20sIHJlbW92ZVdvcmRzLCBjaGFyYWN0ZXIoMCkpCnNlbnRlbmNlQ29ycHVzX2VtcGlyaWNpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2VtcGlyaWNpc20sIHJlbW92ZVB1bmN0dWF0aW9uKQpzZW50ZW5jZUNvcnB1c19lbXBpcmljaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19lbXBpcmljaXNtLCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4X2VtcGlyaWNpc20gPC0gVGVybURvY3VtZW50TWF0cml4KHNlbnRlbmNlQ29ycHVzX2VtcGlyaWNpc20pCnRlcm1fbWF0cml4X2VtcGlyaWNpc20gPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeF9lbXBpcmljaXNtLCAwLjk5KQp0ZXJtX21hdHJpeF9lbXBpcmljaXNtX3RpZHkgPSB0aWR5dGV4dDo6dGlkeSh0ZXJtX21hdHJpeF9lbXBpcmljaXNtKQp0ZXJtX21hdHJpeF9lbXBpcmljaXNtX292ZXJhbGwgPSBzdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXhfZW1waXJpY2lzbV90aWR5LCB0ZXJtKSwgc3VtKGNvdW50KSkKI3Rlcm1fbWF0cml4X2VtcGlyaWNpc21fb3ZlcmFsbAoKI3dvcmRjbG91ZCh0ZXJtX21hdHJpeF9lbXBpcmljaXNtX292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeF9lbXBpcmljaXNtX292ZXJhbGwkYHN1bShjb3VudClgLG1pbi5mcmVxPTkuNSxjb2w9YnJld2VyLnBhbCg4LCJEYXJrMiIpLHJvdC5wZXI9MC4zKQoKdGVybV9tYXRyaXhfZW1waXJpY2lzbV9wZXJjIDwtIHRlcm1fbWF0cml4X2VtcGlyaWNpc21fb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQojdGVybV9tYXRyaXhfZW1waXJpY2lzbV9wZXJjCgpzYW1wbGVfZW1waXJpY2lzbSA8LSB0ZXJtX21hdHJpeF9lbXBpcmljaXNtX3BlcmMgJT4lCiAgZmlsdGVyKHBlcmMgPj0gMC4wMDUpCmhlYWQoc2FtcGxlX2VtcGlyaWNpc20sbj0xMCkKYGBgCgojIyMjIyBSYXRpb25hbGlzbQpgYGB7ciB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9CnJhdGlvbmFsaXNtIDwtIHB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8zICU+JQogIGZpbHRlcihzY2hvb2wgPT0gInJhdGlvbmFsaXNtIikKCnNlbnRlbmNlQ29ycHVzX3JhdGlvbmFsaXNtIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UocmF0aW9uYWxpc20kc2VudGVuY2VfbG93ZXJlZCkpCnNlbnRlbmNlQ29ycHVzX3JhdGlvbmFsaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19yYXRpb25hbGlzbSwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiIikpCnNlbnRlbmNlQ29ycHVzX3JhdGlvbmFsaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19yYXRpb25hbGlzbSwgcmVtb3ZlV29yZHMsIGNoYXJhY3RlcigwKSkKc2VudGVuY2VDb3JwdXNfcmF0aW9uYWxpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX3JhdGlvbmFsaXNtLCByZW1vdmVQdW5jdHVhdGlvbikKc2VudGVuY2VDb3JwdXNfcmF0aW9uYWxpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX3JhdGlvbmFsaXNtLCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4X3JhdGlvbmFsaXNtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChzZW50ZW5jZUNvcnB1c19yYXRpb25hbGlzbSkKdGVybV9tYXRyaXhfcmF0aW9uYWxpc20gPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeF9yYXRpb25hbGlzbSwgMC45OSkKdGVybV9tYXRyaXhfcmF0aW9uYWxpc21fdGlkeSA9IHRpZHl0ZXh0Ojp0aWR5KHRlcm1fbWF0cml4X3JhdGlvbmFsaXNtKQp0ZXJtX21hdHJpeF9yYXRpb25hbGlzbV9vdmVyYWxsID0gc3VtbWFyaXNlKGdyb3VwX2J5KHRlcm1fbWF0cml4X3JhdGlvbmFsaXNtX3RpZHksIHRlcm0pLCBzdW0oY291bnQpKQojdGVybV9tYXRyaXhfcmF0aW9uYWxpc21fb3ZlcmFsbAoKI3dvcmRjbG91ZCh0ZXJtX21hdHJpeF9yYXRpb25hbGlzbV9vdmVyYWxsJHRlcm0sdGVybV9tYXRyaXhfcmF0aW9uYWxpc21fb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCgp0ZXJtX21hdHJpeF9yYXRpb25hbGlzbV9wZXJjIDwtIHRlcm1fbWF0cml4X3JhdGlvbmFsaXNtX292ZXJhbGwgJT4lCiAgbXV0YXRlKHBlcmMgPSBgc3VtKGNvdW50KWAvc3VtKGBzdW0oY291bnQpYCkpICU+JQogIGFycmFuZ2UoZGVzYyhwZXJjKSkKI3Rlcm1fbWF0cml4X3JhdGlvbmFsaXNtX3BlcmMKCnNhbXBsZV9yYXRpb25hbGlzbSA8LSB0ZXJtX21hdHJpeF9yYXRpb25hbGlzbV9wZXJjICU+JQogIGZpbHRlcihwZXJjID49IDAuMDA1KQpoZWFkKHNhbXBsZV9yYXRpb25hbGlzbSxuPTEwKQpgYGAKCiMjIyMjIENvbnRpbmVudGFsCmBgYHtyIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRX0KY29udGluZW50YWwgPC0gcHVibGlzaF9kYXRlX2NsYXNzaWZ5XzMgJT4lCiAgZmlsdGVyKHNjaG9vbCA9PSAiY29udGluZW50YWwiKQoKc2VudGVuY2VDb3JwdXNfY29udGluZW50YWwgPC0gQ29ycHVzKFZlY3RvclNvdXJjZShjb250aW5lbnRhbCRzZW50ZW5jZV9sb3dlcmVkKSkKc2VudGVuY2VDb3JwdXNfY29udGluZW50YWwgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2NvbnRpbmVudGFsLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCIiKSkKc2VudGVuY2VDb3JwdXNfY29udGluZW50YWwgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2NvbnRpbmVudGFsLCByZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKQpzZW50ZW5jZUNvcnB1c19jb250aW5lbnRhbCA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfY29udGluZW50YWwsIHJlbW92ZVB1bmN0dWF0aW9uKQpzZW50ZW5jZUNvcnB1c19jb250aW5lbnRhbCA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfY29udGluZW50YWwsIHN0cmlwV2hpdGVzcGFjZSkKdGVybV9tYXRyaXhfY29udGluZW50YWwgPC0gVGVybURvY3VtZW50TWF0cml4KHNlbnRlbmNlQ29ycHVzX2NvbnRpbmVudGFsKQp0ZXJtX21hdHJpeF9jb250aW5lbnRhbCA9IHJlbW92ZVNwYXJzZVRlcm1zKHRlcm1fbWF0cml4X2NvbnRpbmVudGFsLCAwLjk5KQp0ZXJtX21hdHJpeF9jb250aW5lbnRhbF90aWR5ID0gdGlkeXRleHQ6OnRpZHkodGVybV9tYXRyaXhfY29udGluZW50YWwpCnRlcm1fbWF0cml4X2NvbnRpbmVudGFsX292ZXJhbGwgPSBzdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXhfY29udGluZW50YWxfdGlkeSwgdGVybSksIHN1bShjb3VudCkpCiN0ZXJtX21hdHJpeF9jb250aW5lbnRhbF9vdmVyYWxsCgojd29yZGNsb3VkKHRlcm1fbWF0cml4X2NvbnRpbmVudGFsX292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeF9jb250aW5lbnRhbF9vdmVyYWxsJGBzdW0oY291bnQpYCxtaW4uZnJlcT05LjUsY29sPWJyZXdlci5wYWwoOCwiRGFyazIiKSxyb3QucGVyPTAuMykKCnRlcm1fbWF0cml4X2NvbnRpbmVudGFsX3BlcmMgPC0gdGVybV9tYXRyaXhfY29udGluZW50YWxfb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQojdGVybV9tYXRyaXhfY29udGluZW50YWxfcGVyYwoKc2FtcGxlX2NvbnRpbmVudGFsIDwtIHRlcm1fbWF0cml4X2NvbnRpbmVudGFsX3BlcmMgJT4lCiAgZmlsdGVyKHBlcmMgPj0gMC4wMDUpCmhlYWQoc2FtcGxlX2NvbnRpbmVudGFsLCBuPTEwKQpgYGAKCiMjIyMjIEdlcm1hbl9pZGVhbGlzbQpgYGB7ciB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9Cmdlcm1hbl9pZGVhbGlzbSA8LSBwdWJsaXNoX2RhdGVfY2xhc3NpZnlfMyAlPiUKICBmaWx0ZXIoc2Nob29sID09ICJnZXJtYW5faWRlYWxpc20iKQoKc2VudGVuY2VDb3JwdXNfZ2VybWFuX2lkZWFsaXNtIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoZ2VybWFuX2lkZWFsaXNtJHNlbnRlbmNlX2xvd2VyZWQpKQpzZW50ZW5jZUNvcnB1c19nZXJtYW5faWRlYWxpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2dlcm1hbl9pZGVhbGlzbSwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiIikpCnNlbnRlbmNlQ29ycHVzX2dlcm1hbl9pZGVhbGlzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfZ2VybWFuX2lkZWFsaXNtLCByZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKQpzZW50ZW5jZUNvcnB1c19nZXJtYW5faWRlYWxpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2dlcm1hbl9pZGVhbGlzbSwgcmVtb3ZlUHVuY3R1YXRpb24pCnNlbnRlbmNlQ29ycHVzX2dlcm1hbl9pZGVhbGlzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfZ2VybWFuX2lkZWFsaXNtLCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4X2dlcm1hbl9pZGVhbGlzbSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoc2VudGVuY2VDb3JwdXNfZ2VybWFuX2lkZWFsaXNtKQp0ZXJtX21hdHJpeF9nZXJtYW5faWRlYWxpc20gPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeF9nZXJtYW5faWRlYWxpc20sIDAuOTkpCnRlcm1fbWF0cml4X2dlcm1hbl9pZGVhbGlzbV90aWR5ID0gdGlkeXRleHQ6OnRpZHkodGVybV9tYXRyaXhfZ2VybWFuX2lkZWFsaXNtKQp0ZXJtX21hdHJpeF9nZXJtYW5faWRlYWxpc21fb3ZlcmFsbCA9IHN1bW1hcmlzZShncm91cF9ieSh0ZXJtX21hdHJpeF9nZXJtYW5faWRlYWxpc21fdGlkeSwgdGVybSksIHN1bShjb3VudCkpCiN0ZXJtX21hdHJpeF9nZXJtYW5faWRlYWxpc21fb3ZlcmFsbAoKI3dvcmRjbG91ZCh0ZXJtX21hdHJpeF9nZXJtYW5faWRlYWxpc21fb3ZlcmFsbCR0ZXJtLHRlcm1fbWF0cml4X2dlcm1hbl9pZGVhbGlzbV9vdmVyYWxsJGBzdW0oY291bnQpYCxtaW4uZnJlcT05LjUsY29sPWJyZXdlci5wYWwoOCwiRGFyazIiKSxyb3QucGVyPTAuMykKCnRlcm1fbWF0cml4X2dlcm1hbl9pZGVhbGlzbV9wZXJjIDwtIHRlcm1fbWF0cml4X2dlcm1hbl9pZGVhbGlzbV9vdmVyYWxsICU+JQogIG11dGF0ZShwZXJjID0gYHN1bShjb3VudClgL3N1bShgc3VtKGNvdW50KWApKSAlPiUKICBhcnJhbmdlKGRlc2MocGVyYykpCiN0ZXJtX21hdHJpeF9nZXJtYW5faWRlYWxpc21fcGVyYwoKc2FtcGxlX2dlcm1hbl9pZGVhbGlzbSA8LSB0ZXJtX21hdHJpeF9nZXJtYW5faWRlYWxpc21fcGVyYyAlPiUKICBmaWx0ZXIocGVyYyA+PSAwLjAwNSkKaGVhZChzYW1wbGVfZ2VybWFuX2lkZWFsaXNtLG49MTApCmBgYAoKIyMjIyMgUGhlbm9tZW5vbG9neQpgYGB7ciB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9CnBoZW5vbWVub2xvZ3kgPC0gcHVibGlzaF9kYXRlX2NsYXNzaWZ5XzMgJT4lCiAgZmlsdGVyKHNjaG9vbCA9PSAicGhlbm9tZW5vbG9neSIpCgpzZW50ZW5jZUNvcnB1c19waGVub21lbm9sb2d5IDwtIENvcnB1cyhWZWN0b3JTb3VyY2UocGhlbm9tZW5vbG9neSRzZW50ZW5jZV9sb3dlcmVkKSkKc2VudGVuY2VDb3JwdXNfcGhlbm9tZW5vbG9neSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfcGhlbm9tZW5vbG9neSwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiIikpCnNlbnRlbmNlQ29ycHVzX3BoZW5vbWVub2xvZ3kgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX3BoZW5vbWVub2xvZ3ksIHJlbW92ZVdvcmRzLCBjaGFyYWN0ZXIoMCkpCnNlbnRlbmNlQ29ycHVzX3BoZW5vbWVub2xvZ3kgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX3BoZW5vbWVub2xvZ3ksIHJlbW92ZVB1bmN0dWF0aW9uKQpzZW50ZW5jZUNvcnB1c19waGVub21lbm9sb2d5IDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19waGVub21lbm9sb2d5LCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4X3BoZW5vbWVub2xvZ3kgPC0gVGVybURvY3VtZW50TWF0cml4KHNlbnRlbmNlQ29ycHVzX3BoZW5vbWVub2xvZ3kpCnRlcm1fbWF0cml4X3BoZW5vbWVub2xvZ3kgPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeF9waGVub21lbm9sb2d5LCAwLjk5KQp0ZXJtX21hdHJpeF9waGVub21lbm9sb2d5X3RpZHkgPSB0aWR5dGV4dDo6dGlkeSh0ZXJtX21hdHJpeF9waGVub21lbm9sb2d5KQp0ZXJtX21hdHJpeF9waGVub21lbm9sb2d5X292ZXJhbGwgPSBzdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXhfcGhlbm9tZW5vbG9neV90aWR5LCB0ZXJtKSwgc3VtKGNvdW50KSkKI3Rlcm1fbWF0cml4X3BoZW5vbWVub2xvZ3lfb3ZlcmFsbAoKI3dvcmRjbG91ZCh0ZXJtX21hdHJpeF9waGVub21lbm9sb2d5X292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeF9waGVub21lbm9sb2d5X292ZXJhbGwkYHN1bShjb3VudClgLG1pbi5mcmVxPTkuNSxjb2w9YnJld2VyLnBhbCg4LCJEYXJrMiIpLHJvdC5wZXI9MC4zKQoKdGVybV9tYXRyaXhfcGhlbm9tZW5vbG9neV9wZXJjIDwtIHRlcm1fbWF0cml4X3BoZW5vbWVub2xvZ3lfb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQojdGVybV9tYXRyaXhfcGhlbm9tZW5vbG9neV9wZXJjCgpzYW1wbGVfcGhlbm9tZW5vbG9neSA8LSB0ZXJtX21hdHJpeF9waGVub21lbm9sb2d5X3BlcmMgJT4lCiAgZmlsdGVyKHBlcmMgPj0gMC4wMDUpCmhlYWQoc2FtcGxlX3BoZW5vbWVub2xvZ3ksbj0xMCkKYGBgCgojIyMjIyBDb21tdW5pc20KYGBge3Igd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQpjb21tdW5pc20gPC0gcHVibGlzaF9kYXRlX2NsYXNzaWZ5XzMgJT4lCiAgZmlsdGVyKHNjaG9vbCA9PSAiY29tbXVuaXNtIikKCnNlbnRlbmNlQ29ycHVzX2NvbW11bmlzbSA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGNvbW11bmlzbSRzZW50ZW5jZV9sb3dlcmVkKSkKc2VudGVuY2VDb3JwdXNfY29tbXVuaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19jb21tdW5pc20sIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoIiIpKQpzZW50ZW5jZUNvcnB1c19jb21tdW5pc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2NvbW11bmlzbSwgcmVtb3ZlV29yZHMsIGNoYXJhY3RlcigwKSkKc2VudGVuY2VDb3JwdXNfY29tbXVuaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19jb21tdW5pc20sIHJlbW92ZVB1bmN0dWF0aW9uKQpzZW50ZW5jZUNvcnB1c19jb21tdW5pc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2NvbW11bmlzbSwgc3RyaXBXaGl0ZXNwYWNlKQp0ZXJtX21hdHJpeF9jb21tdW5pc20gPC0gVGVybURvY3VtZW50TWF0cml4KHNlbnRlbmNlQ29ycHVzX2NvbW11bmlzbSkKdGVybV9tYXRyaXhfY29tbXVuaXNtID0gcmVtb3ZlU3BhcnNlVGVybXModGVybV9tYXRyaXhfY29tbXVuaXNtLCAwLjk5KQp0ZXJtX21hdHJpeF9jb21tdW5pc21fdGlkeSA9IHRpZHl0ZXh0Ojp0aWR5KHRlcm1fbWF0cml4X2NvbW11bmlzbSkKdGVybV9tYXRyaXhfY29tbXVuaXNtX292ZXJhbGwgPSBzdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXhfY29tbXVuaXNtX3RpZHksIHRlcm0pLCBzdW0oY291bnQpKQojdGVybV9tYXRyaXhfY29tbXVuaXNtX292ZXJhbGwKCiN3b3JkY2xvdWQodGVybV9tYXRyaXhfY29tbXVuaXNtX292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeF9jb21tdW5pc21fb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCgp0ZXJtX21hdHJpeF9jb21tdW5pc21fcGVyYyA8LSB0ZXJtX21hdHJpeF9jb21tdW5pc21fb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQojdGVybV9tYXRyaXhfY29tbXVuaXNtX3BlcmMKCnNhbXBsZV9jb21tdW5pc20gPC0gdGVybV9tYXRyaXhfY29tbXVuaXNtX3BlcmMgJT4lCiAgZmlsdGVyKHBlcmMgPj0gMC4wMDUpCmhlYWQoc2FtcGxlX2NvbW11bmlzbSxuPTEwKQpgYGAKCiMjIyMjIE5pZXR6c2NoZQpgYGB7ciB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9Cm5pZXR6c2NoZSA8LSBwdWJsaXNoX2RhdGVfY2xhc3NpZnlfMyAlPiUKICBmaWx0ZXIoc2Nob29sID09ICJuaWV0enNjaGUiKQoKc2VudGVuY2VDb3JwdXNfbmlldHpzY2hlIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UobmlldHpzY2hlJHNlbnRlbmNlX2xvd2VyZWQpKQpzZW50ZW5jZUNvcnB1c19uaWV0enNjaGUgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX25pZXR6c2NoZSwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiIikpCnNlbnRlbmNlQ29ycHVzX25pZXR6c2NoZSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfbmlldHpzY2hlLCByZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKQpzZW50ZW5jZUNvcnB1c19uaWV0enNjaGUgPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX25pZXR6c2NoZSwgcmVtb3ZlUHVuY3R1YXRpb24pCnNlbnRlbmNlQ29ycHVzX25pZXR6c2NoZSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfbmlldHpzY2hlLCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4X25pZXR6c2NoZSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoc2VudGVuY2VDb3JwdXNfbmlldHpzY2hlKQp0ZXJtX21hdHJpeF9uaWV0enNjaGUgPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeF9uaWV0enNjaGUsIDAuOTkpCnRlcm1fbWF0cml4X25pZXR6c2NoZV90aWR5ID0gdGlkeXRleHQ6OnRpZHkodGVybV9tYXRyaXhfbmlldHpzY2hlKQp0ZXJtX21hdHJpeF9uaWV0enNjaGVfb3ZlcmFsbCA9IHN1bW1hcmlzZShncm91cF9ieSh0ZXJtX21hdHJpeF9uaWV0enNjaGVfdGlkeSwgdGVybSksIHN1bShjb3VudCkpCiN0ZXJtX21hdHJpeF9uaWV0enNjaGVfb3ZlcmFsbAoKI3dvcmRjbG91ZCh0ZXJtX21hdHJpeF9uaWV0enNjaGVfb3ZlcmFsbCR0ZXJtLHRlcm1fbWF0cml4X25pZXR6c2NoZV9vdmVyYWxsJGBzdW0oY291bnQpYCxtaW4uZnJlcT05LjUsY29sPWJyZXdlci5wYWwoOCwiRGFyazIiKSxyb3QucGVyPTAuMykKCnRlcm1fbWF0cml4X25pZXR6c2NoZV9wZXJjIDwtIHRlcm1fbWF0cml4X25pZXR6c2NoZV9vdmVyYWxsICU+JQogIG11dGF0ZShwZXJjID0gYHN1bShjb3VudClgL3N1bShgc3VtKGNvdW50KWApKSAlPiUKICBhcnJhbmdlKGRlc2MocGVyYykpCiN0ZXJtX21hdHJpeF9uaWV0enNjaGVfcGVyYwoKc2FtcGxlX25pZXR6c2NoZSA8LSB0ZXJtX21hdHJpeF9uaWV0enNjaGVfcGVyYyAlPiUKICBmaWx0ZXIocGVyYyA+PSAwLjAwNSkKaGVhZChzYW1wbGVfbmlldHpzY2hlLG49MTApCmBgYAoKIyMjIyMgRmVtaW5pc20KYGBge3Igd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQpmZW1pbmlzbSA8LSBwdWJsaXNoX2RhdGVfY2xhc3NpZnlfMyAlPiUKICBmaWx0ZXIoc2Nob29sID09ICJmZW1pbmlzbSIpCgpzZW50ZW5jZUNvcnB1c19mZW1pbmlzbSA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGZlbWluaXNtJHNlbnRlbmNlX2xvd2VyZWQpKQpzZW50ZW5jZUNvcnB1c19mZW1pbmlzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfZmVtaW5pc20sIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkKc2VudGVuY2VDb3JwdXNfZmVtaW5pc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2ZlbWluaXNtLCByZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKQpzZW50ZW5jZUNvcnB1c19mZW1pbmlzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfZmVtaW5pc20sIHJlbW92ZVB1bmN0dWF0aW9uKQpzZW50ZW5jZUNvcnB1c19mZW1pbmlzbSA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfZmVtaW5pc20sIHN0cmlwV2hpdGVzcGFjZSkKdGVybV9tYXRyaXhfZmVtaW5pc20gPC0gVGVybURvY3VtZW50TWF0cml4KHNlbnRlbmNlQ29ycHVzX2ZlbWluaXNtKQp0ZXJtX21hdHJpeF9mZW1pbmlzbSA9IHJlbW92ZVNwYXJzZVRlcm1zKHRlcm1fbWF0cml4X2ZlbWluaXNtLCAwLjk5KQp0ZXJtX21hdHJpeF9mZW1pbmlzbV90aWR5ID0gdGlkeXRleHQ6OnRpZHkodGVybV9tYXRyaXhfZmVtaW5pc20pCnRlcm1fbWF0cml4X2ZlbWluaXNtX292ZXJhbGwgPSBzdW1tYXJpc2UoZ3JvdXBfYnkodGVybV9tYXRyaXhfZmVtaW5pc21fdGlkeSwgdGVybSksIHN1bShjb3VudCkpCiN0ZXJtX21hdHJpeF9mZW1pbmlzbV9vdmVyYWxsCgojd29yZGNsb3VkKHRlcm1fbWF0cml4X2ZlbWluaXNtX292ZXJhbGwkdGVybSx0ZXJtX21hdHJpeF9mZW1pbmlzbV9vdmVyYWxsJGBzdW0oY291bnQpYCxtaW4uZnJlcT05LjUsY29sPWJyZXdlci5wYWwoOCwiRGFyazIiKSxyb3QucGVyPTAuMykKCnRlcm1fbWF0cml4X2ZlbWluaXNtX3BlcmMgPC0gdGVybV9tYXRyaXhfZmVtaW5pc21fb3ZlcmFsbCAlPiUKICBtdXRhdGUocGVyYyA9IGBzdW0oY291bnQpYC9zdW0oYHN1bShjb3VudClgKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBlcmMpKQojdGVybV9tYXRyaXhfZmVtaW5pc21fcGVyYwoKc2FtcGxlX2ZlbWluaXNtIDwtIHRlcm1fbWF0cml4X2ZlbWluaXNtX3BlcmMgJT4lCiAgZmlsdGVyKHBlcmMgPj0gMC4wMDUpCmhlYWQoc2FtcGxlX2ZlbWluaXNtLG49MTApCmBgYAoKIyMjIyMgSG9iYmVzCmBgYHtyIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRX0KaG9iYmVzIDwtIHB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8zICU+JQogIGZpbHRlcihzY2hvb2wgPT0gIkhvYmJlcyIpCgpzZW50ZW5jZUNvcnB1c19ob2JiZXMgPC0gQ29ycHVzKFZlY3RvclNvdXJjZShob2JiZXMkc2VudGVuY2Vfc3RyKSkKc2VudGVuY2VDb3JwdXNfaG9iYmVzIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19ob2JiZXMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkKc2VudGVuY2VDb3JwdXNfaG9iYmVzIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19ob2JiZXMsIHJlbW92ZVdvcmRzLCBjaGFyYWN0ZXIoMCkpCnNlbnRlbmNlQ29ycHVzX2hvYmJlcyA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfaG9iYmVzLCByZW1vdmVQdW5jdHVhdGlvbikKc2VudGVuY2VDb3JwdXNfaG9iYmVzIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19ob2JiZXMsIHN0cmlwV2hpdGVzcGFjZSkKdGVybV9tYXRyaXhfaG9iYmVzIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChzZW50ZW5jZUNvcnB1c19ob2JiZXMpCnRlcm1fbWF0cml4X2hvYmJlcyA9IHJlbW92ZVNwYXJzZVRlcm1zKHRlcm1fbWF0cml4X2hvYmJlcywgMC45OSkKdGVybV9tYXRyaXhfaG9iYmVzX3RpZHkgPSB0aWR5dGV4dDo6dGlkeSh0ZXJtX21hdHJpeF9ob2JiZXMpCnRlcm1fbWF0cml4X2hvYmJlc19vdmVyYWxsID0gc3VtbWFyaXNlKGdyb3VwX2J5KHRlcm1fbWF0cml4X2hvYmJlc190aWR5LCB0ZXJtKSwgc3VtKGNvdW50KSkKI3Rlcm1fbWF0cml4X2hvYmJlc19vdmVyYWxsCgojd29yZGNsb3VkKHRlcm1fbWF0cml4X2hvYmJlc19vdmVyYWxsJHRlcm0sdGVybV9tYXRyaXhfaG9iYmVzX292ZXJhbGwkYHN1bShjb3VudClgLG1pbi5mcmVxPTkuNSxjb2w9YnJld2VyLnBhbCg4LCJEYXJrMiIpLHJvdC5wZXI9MC4zKQoKdGVybV9tYXRyaXhfaG9iYmVzX3BlcmMgPC0gdGVybV9tYXRyaXhfaG9iYmVzX292ZXJhbGwgJT4lCiAgbXV0YXRlKHBlcmMgPSBgc3VtKGNvdW50KWAvc3VtKGBzdW0oY291bnQpYCkpICU+JQogIGFycmFuZ2UoZGVzYyhwZXJjKSkKI3Rlcm1fbWF0cml4X2hvYmJlc19wZXJjCgpzYW1wbGVfaG9iYmVzIDwtIHRlcm1fbWF0cml4X2hvYmJlc19wZXJjICU+JQogIGZpbHRlcihwZXJjID49IDAuMDA1KQpoZWFkKHNhbXBsZV9ob2JiZXMsIG49MTApCmBgYAoKIyMjIyMgS2llcmtlZ2FhcmQKYGBge3Igd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQpraWVya2VnYWFyZCA8LSBwdWJsaXNoX2RhdGVfY2xhc3NpZnlfMyAlPiUKICBmaWx0ZXIoc2Nob29sID09ICJLaWVya2VnYWFyZCIpCgpzZW50ZW5jZUNvcnB1c19raWVya2VnYWFyZCA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGtpZXJrZWdhYXJkJHNlbnRlbmNlX3N0cikpCnNlbnRlbmNlQ29ycHVzX2tpZXJrZWdhYXJkIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19raWVya2VnYWFyZCwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiZW5nbGlzaCIpKQpzZW50ZW5jZUNvcnB1c19raWVya2VnYWFyZCA8LSB0bV9tYXAoc2VudGVuY2VDb3JwdXNfa2llcmtlZ2FhcmQsIHJlbW92ZVdvcmRzLCBjaGFyYWN0ZXIoMCkpCnNlbnRlbmNlQ29ycHVzX2tpZXJrZWdhYXJkIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19raWVya2VnYWFyZCwgcmVtb3ZlUHVuY3R1YXRpb24pCnNlbnRlbmNlQ29ycHVzX2tpZXJrZWdhYXJkIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19raWVya2VnYWFyZCwgc3RyaXBXaGl0ZXNwYWNlKQp0ZXJtX21hdHJpeF9raWVya2VnYWFyZCA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoc2VudGVuY2VDb3JwdXNfa2llcmtlZ2FhcmQpCnRlcm1fbWF0cml4X2tpZXJrZWdhYXJkID0gcmVtb3ZlU3BhcnNlVGVybXModGVybV9tYXRyaXhfa2llcmtlZ2FhcmQsIDAuOTkpCnRlcm1fbWF0cml4X2tpZXJrZWdhYXJkX3RpZHkgPSB0aWR5dGV4dDo6dGlkeSh0ZXJtX21hdHJpeF9raWVya2VnYWFyZCkKdGVybV9tYXRyaXhfa2llcmtlZ2FhcmRfb3ZlcmFsbCA9IHN1bW1hcmlzZShncm91cF9ieSh0ZXJtX21hdHJpeF9raWVya2VnYWFyZF90aWR5LCB0ZXJtKSwgc3VtKGNvdW50KSkKI3Rlcm1fbWF0cml4X2tpZXJrZWdhYXJkX292ZXJhbGwKCiN3b3JkY2xvdWQodGVybV9tYXRyaXhfa2llcmtlZ2FhcmRfb3ZlcmFsbCR0ZXJtLHRlcm1fbWF0cml4X2tpZXJrZWdhYXJkX292ZXJhbGwkYHN1bShjb3VudClgLG1pbi5mcmVxPTkuNSxjb2w9YnJld2VyLnBhbCg4LCJEYXJrMiIpLHJvdC5wZXI9MC4zKQoKdGVybV9tYXRyaXhfa2llcmtlZ2FhcmRfcGVyYyA8LSB0ZXJtX21hdHJpeF9raWVya2VnYWFyZF9vdmVyYWxsICU+JQogIG11dGF0ZShwZXJjID0gYHN1bShjb3VudClgL3N1bShgc3VtKGNvdW50KWApKSAlPiUKICBhcnJhbmdlKGRlc2MocGVyYykpCiN0ZXJtX21hdHJpeF9raWVya2VnYWFyZF9wZXJjCgpzYW1wbGVfa2llcmtlZ2FhcmQgPC0gdGVybV9tYXRyaXhfa2llcmtlZ2FhcmRfcGVyYyAlPiUKICBmaWx0ZXIocGVyYyA+PSAwLjAwNSkKaGVhZChzYW1wbGVfa2llcmtlZ2FhcmQsbj0xMCkKYGBgCgojIyMjIyBFeGlzdGVudGlhbGlzbQpgYGB7ciB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9CmV4aXN0ZW50aWFsaXNtIDwtIHB1Ymxpc2hfZGF0ZV9jbGFzc2lmeV8zICU+JQogIGZpbHRlcihzY2hvb2wgPT0gIkV4aXN0ZW50aWFsaXNtIikKCnNlbnRlbmNlQ29ycHVzX2V4aXN0ZW50aWFsaXNtIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoZXhpc3RlbnRpYWxpc20kc2VudGVuY2Vfc3RyKSkKc2VudGVuY2VDb3JwdXNfZXhpc3RlbnRpYWxpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2V4aXN0ZW50aWFsaXNtLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpCnNlbnRlbmNlQ29ycHVzX2V4aXN0ZW50aWFsaXNtIDwtIHRtX21hcChzZW50ZW5jZUNvcnB1c19leGlzdGVudGlhbGlzbSwgcmVtb3ZlV29yZHMsIGNoYXJhY3RlcigwKSkKc2VudGVuY2VDb3JwdXNfZXhpc3RlbnRpYWxpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2V4aXN0ZW50aWFsaXNtLCByZW1vdmVQdW5jdHVhdGlvbikKc2VudGVuY2VDb3JwdXNfZXhpc3RlbnRpYWxpc20gPC0gdG1fbWFwKHNlbnRlbmNlQ29ycHVzX2V4aXN0ZW50aWFsaXNtLCBzdHJpcFdoaXRlc3BhY2UpCnRlcm1fbWF0cml4X2V4aXN0ZW50aWFsaXNtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChzZW50ZW5jZUNvcnB1c19leGlzdGVudGlhbGlzbSkKdGVybV9tYXRyaXhfZXhpc3RlbnRpYWxpc20gPSByZW1vdmVTcGFyc2VUZXJtcyh0ZXJtX21hdHJpeF9leGlzdGVudGlhbGlzbSwgMC45OSkKdGVybV9tYXRyaXhfZXhpc3RlbnRpYWxpc21fdGlkeSA9IHRpZHl0ZXh0Ojp0aWR5KHRlcm1fbWF0cml4X2V4aXN0ZW50aWFsaXNtKQp0ZXJtX21hdHJpeF9leGlzdGVudGlhbGlzbV9vdmVyYWxsID0gc3VtbWFyaXNlKGdyb3VwX2J5KHRlcm1fbWF0cml4X2V4aXN0ZW50aWFsaXNtX3RpZHksIHRlcm0pLCBzdW0oY291bnQpKQojdGVybV9tYXRyaXhfZXhpc3RlbnRpYWxpc21fb3ZlcmFsbAoKI3dvcmRjbG91ZCh0ZXJtX21hdHJpeF9leGlzdGVudGlhbGlzbV9vdmVyYWxsJHRlcm0sdGVybV9tYXRyaXhfZXhpc3RlbnRpYWxpc21fb3ZlcmFsbCRgc3VtKGNvdW50KWAsbWluLmZyZXE9OS41LGNvbD1icmV3ZXIucGFsKDgsIkRhcmsyIikscm90LnBlcj0wLjMpCgp0ZXJtX21hdHJpeF9leGlzdGVudGlhbGlzbV9wZXJjIDwtIHRlcm1fbWF0cml4X2V4aXN0ZW50aWFsaXNtX292ZXJhbGwgJT4lCiAgbXV0YXRlKHBlcmMgPSBgc3VtKGNvdW50KWAvc3VtKGBzdW0oY291bnQpYCkpICU+JQogIGFycmFuZ2UoZGVzYyhwZXJjKSkKI3Rlcm1fbWF0cml4X2V4aXN0ZW50aWFsaXNtX3BlcmMKCnNhbXBsZV9leGlzdGVudGlhbGlzbSA8LSB0ZXJtX21hdHJpeF9leGlzdGVudGlhbGlzbV9wZXJjICU+JQogIGZpbHRlcihwZXJjID49IDAuMDA1KQpoZWFkKHNhbXBsZV9leGlzdGVudGlhbGlzbSxuPTEwKQpgYGAKCiMjIyMjIENvbXBhcmlzaW9uIGJldHdlZW4gdGhlIHNjaG9vbHMgaW4gdGltZSBwZXJpb2QgMwpXZSBjYWxjdWxhdGUgSmFjY2FyZCBJbmRleCBhbmQgaGF2ZSB0aGUgcmVzdWx0czoKYGBge3IsZWNobz1GQUxTRX0KdGltZV9wZXJpb2RfMyA8LSBsaXN0KGVtcGlyaWNpc20gPSBzYW1wbGVfZW1waXJpY2lzbSwKICAgICAgICAgICAgICAgICAgICAgIHJhdGlvbmFsaXNtID0gc2FtcGxlX3JhdGlvbmFsaXNtLAogICAgICAgICAgICAgICAgICAgICAgYW5hbHl0aWMgPSBzYW1wbGVfYW5hbHl0aWMsCiAgICAgICAgICAgICAgICAgICAgICBjb250aW5lbnRhbCA9IHNhbXBsZV9jb250aW5lbnRhbCwKICAgICAgICAgICAgICAgICAgICAgIHBoZW5vbWVub2xvZ3kgPSBzYW1wbGVfcGhlbm9tZW5vbG9neSwKICAgICAgICAgICAgICAgICAgICAgIGdlcm1hbl9pZGVhbGlzbSA9IHNhbXBsZV9nZXJtYW5faWRlYWxpc20sCiAgICAgICAgICAgICAgICAgICAgICBjb21tdW5pc20gPSBzYW1wbGVfY29tbXVuaXNtLAogICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGlzbSA9IHNhbXBsZV9jYXBpdGFsaXNtLAogICAgICAgICAgICAgICAgICAgICAgbmlldHpzY2hlID0gc2FtcGxlX25pZXR6c2NoZSwKICAgICAgICAgICAgICAgICAgICAgIGZlbWluaXNtID0gc2FtcGxlX2ZlbWluaXNtLCAgICAgIAogICAgICAgICAgICAgICAgICAgICAga2llcmtlZ2FhcmQgPSBzYW1wbGVfa2llcmtlZ2FhcmQsCiAgICAgICAgICAgICAgICAgICAgICBob2JiZXMgPSBzYW1wbGVfaG9iYmVzLAogICAgICAgICAgICAgICAgICAgICAgZXhpc3RlbnRpYWxpc20gPSBzYW1wbGVfZXhpc3RlbnRpYWxpc20pCkpJMyA8LSBhcnJheSgwLCBkaW0gPSBjKDEzLDEzKSkKZm9yKGkgaW4gMToxMyl7CiAgZm9yKGogaW4gMToxMyl7CiAgSkkzW2ksal0gPSBKSSh0aW1lX3BlcmlvZF8zW1tpXV0sdGltZV9wZXJpb2RfM1tbal1dKQogIH0KfQpjb2xuYW1lcyhKSTMpIDwtIGMoImVtcGlyaWNpc20iLCJyYXRpb25hbGlzbSIsImFuYWx5dGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGluZW50YWwiLCJwaGVub21lbm9sb2d5IiwiZ2VybWFuX2lkZWFsaXNtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXNtIiwiY2FwaXRhbGlzbSIsIm5pZXR6c2NoZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbWluaXNtIiwia2llcmtlZ2FhcmQiLCJob2JiZXMiLCJleGlzdGVudGlhbGlzbSIKICAgICAgICAgICAgICAgICAgICAgICAgICApCnJvd25hbWVzKEpJMykgPC0gYygiZW1waXJpY2lzbSIsInJhdGlvbmFsaXNtIiwiYW5hbHl0aWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjb250aW5lbnRhbCIsInBoZW5vbWVub2xvZ3kiLCJnZXJtYW5faWRlYWxpc20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tdW5pc20iLCJjYXBpdGFsaXNtIiwibmlldHpzY2hlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVtaW5pc20iLCJraWVya2VnYWFyZCIsImhvYmJlcyIsImV4aXN0ZW50aWFsaXNtIgogICAgICAgICAgICAgICAgICAgICAgICAgICkKSkkzCmNvcnJwbG90KEpJMywgZGlhZyA9IEZBTFNFKQpgYGAKSXQgY2FuIGJlIHNlZW4gdGhhdCB0aGVyZSBhcmUgc2Nob29scyB3aGljaCBhcmUgcHJldHR5IHNpbWlsYXIsIHdoaWxlIHRoZXJlIGFyZSBzdGlsbCBzb21lIHNjaG9vbHMgaGF2aW5nIGxpdHRsZSBzaW1pbGFyaXR5IHRvIGFub3RoZXIgc3VjaCBhcyBDb21tdW5pc20gb3IgQ2FwaXRhbGlzbS4KCkFzIGEgcmVzdWx0LCB3ZSBjYW5ub3QgY29uY2x1ZGUgdGhhdCBkaWZmZXJlbnQgc2Nob29scyBhdCB0aGUgc2FtZSB0aW1lIGFyZSBjb25jZXJuaW5nIHNpbWlsYXIgcXVlc3Rpb25zLgoKIyMgUXVlc3Rpb24gMzogSWYgcGhpbG9zb3BoZXJzIGF0IGRpZmZlcmVudCB0aW1lIHBlcmlvZCB0aGluayBhYm91dCB0b3RhbGx5IGRpZmZlcmVudCBxdWVzdGlvbnM/CmBgYHtyLGVjaG89RkFMU0V9CmFsbF90aW1lIDwtIGModGltZV9wZXJpb2RfMSwgdGltZV9wZXJpb2RfMiwgdGltZV9wZXJpb2RfMykKSklfb3ZlcmFsbCA8LSBhcnJheSgwLCBkaW0gPSBjKDE4LDE4KSkKZm9yKGkgaW4gMToxOCl7CiAgZm9yKGogaW4gMToxOCl7CiAgSklfb3ZlcmFsbFtpLGpdID0gSkkoYWxsX3RpbWVbW2ldXSxhbGxfdGltZVtbal1dKQogIH0KfQoKY29sbmFtZXMoSklfb3ZlcmFsbCkgPC0gYygiYXJpc3RvdGxlIiwicGxhdG8iLCJkYW9pc20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hvbGFzdGljaXNtIiwic3RvaWNpc20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJlbXBpcmljaXNtIiwicmF0aW9uYWxpc20iLCJhbmFseXRpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRpbmVudGFsIiwicGhlbm9tZW5vbG9neSIsImdlcm1hbl9pZGVhbGlzbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bmlzbSIsImNhcGl0YWxpc20iLCJuaWV0enNjaGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmZW1pbmlzbSIsImtpZXJrZWdhYXJkIiwiaG9iYmVzIiwiZXhpc3RlbnRpYWxpc20iCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQpyb3duYW1lcyhKSV9vdmVyYWxsKSA8LSBjKCJhcmlzdG90bGUiLCJwbGF0byIsImRhb2lzbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaG9sYXN0aWNpc20iLCJzdG9pY2lzbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImVtcGlyaWNpc20iLCJyYXRpb25hbGlzbSIsImFuYWx5dGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGluZW50YWwiLCJwaGVub21lbm9sb2d5IiwiZ2VybWFuX2lkZWFsaXNtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXNtIiwiY2FwaXRhbGlzbSIsIm5pZXR6c2NoZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbWluaXNtIiwia2llcmtlZ2FhcmQiLCJob2JiZXMiLCJleGlzdGVudGlhbGlzbSIKICAgICAgICAgICAgICAgICAgICAgICAgICApCkpJX292ZXJhbGwKYGBgCgpgYGB7cn0KY29ycnBsb3QoSklfb3ZlcmFsbCwgZGlhZyA9IEZBTFNFKQpgYGAKRnJvbSB0aGUgcGxvdCwgd2UgY2FuIHNlZSB0aGF0IEFyaXN0b3RsZSBoYXMgZ3JlYXRlciBzaW1pbGFyaXR5IHRvIFBsYXRvIGFuZCBSYXRpb25hbGlzbTsgUGxhdG8gaXMgcHJldHR5IHNpbWlsYXIgdG8gQXJpc3RvdGxlIGFuZCBOaWV0enNjaGU7IFN0b2ljaXNtIGhhcyBzaW1pbGFyaXR5IHRvIFJhdGlvbmFsaXNtLCBOaWV0enNjaGUgYW5kIEZlbWluaXNtOyBOaWV0enNjaGUgaXMgc2ltaWxhciB0byBQbGF0bywgU2Nob2xhc3RpY2lzbSwgU3RvaWNpc20sIEVtcGlyaWNpc20sIFJhdGlvbmFsaXNtLCBhbmQgYWxzbyBGZW1pbmlzbS4KClRoaXMgbWVhbnMgdGhhdCBldmVuIG5ldyBwcm9ibGVtcyBhcHBlYXJpbmcgYXQgYSBuZXcgdGltZSB3ZXJlIGRpc2N1c3NlZCBieSB0aGUgcGhpbG9zb3BoZXJzIHRoZW4sIG1hbnkgcXVlc3Rpb25zIHJhaXNlZCBieSBhbmNpZW50IHBoaWxvc29waGVycyBhcmUgc3RpbGwgdGhvdWdodCBhYm91dCBieSBsYXRlciBwaGlsb3NvcGhlcnMgYW5kIHRoZSBzb2x1dGlvbiBvciBleHBsYWluYXRpb24gdG8gdGhlbSBtYXkgZGlmZmVyIGFzIHRpbWUgZ29lcyBieS4KCkhvd2V2ZXIsIHRoaXMgaXMgb25seSBhbiBhbmFseXNpcyBiYXNlZCBvbiBzaW5nbGUgd29yZHMgdXNlZCBpbiB0aGUgc2VudGVuY2VzLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gdHdvIHNjaG9vbCB3aXRoIGV4YWN0bHkgZGlmZmVyZW50IG9waW5pb25zIG1heSBoYXZlIHByZXR0eSBoaWdoIHNpbWlsYXJpdHkuIEZvciBpbnN0YW5jZSwgdGhvdWdoIHRoZXJlIGFwcGVhcnMgaGlnaCBzaW1pbGFyaXR5IGJldHdlZW4gRmVtaW5pc20gYW5kIFN0b2ljaXNtLCB0aGV5IGNhbm5vdCBiZSBzaW1pbGFyIGFjdHVhbGx5IGJlY2F1c2UgU3RvaWNpc20gZm9jdXMgb24gdGhlIGFjdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3NtaWMgZGV0ZXJtaW5pc20gYW5kIGh1bWFuIGZyZWVkb20sIHdoaWxlIEZlbWluaXNtIGlzIGEgY29sbGVjdGlvbiBvZiBtb3ZlbWVudHMgYW5kIGlkZW9sb2dpZXMgdGhhdCBhaW1zIHRvIGRlZmluZSwgZXN0YWJsaXNoLCBhbmQgZGVmZW5kIGVxdWFsIHBvbGl0aWNhbCwgZWNvbm9taWMsIGN1bHR1cmFsLCBhbmQgc29jaWFsIHJpZ2h0cyBmb3Igd29tZW4uIAoKIyBDb25jbHVzaW9uCjEuIEFzIHRpbWUgZ29lcyBieSwgcGhpbG9zb3BoZXJzIGRvIHJpc2UgYW5kIGRpc2N1c3MgZGlmZmVyZW50IHF1ZXN0aW9ucyBpbiBkaWZmZXJlbnQgdGltZSBwZXJpb2QuCgoyLiBBdCB0aGUgc2FtZSB0aW1lLCBkaWZmZXJlbnQgc2Nob29scyBtYXkgY29uY2VybiBkaWZmZXJlbnQgcXVlc3Rpb25zLgoKMy4gRXZlbiB0aG91Z2ggaHVtYW4gc29jaWV0eSBkZXZlbG9wcywgbWFueSBvcmlnaW5hbCBpZGVhcyBhbmQgdGhvdWdodHMgaW4gYW5jaWVudCB0aW1lcyBhcmUgc3RpbGwgdGhvdWdodCBhYm91dCBieSBwZW9wbGUgaW4gbGF0ZXIgeWVhcnMuCgo0LiBFeGNlcHQgZm9yIHRpbWUsIG90aGVyIGZhY3RvcnMgc3VjaCBhcyBvcmlnaW5hdGluZyBjb3VudHJ5IG9mIHRoZSBzY2hvb2xzLCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgc2Nob29scywgb3IgZm9jdXNlcyBvZiB0aG91Z2h0cyBvZiBkaWZmZXJlbnQgYXV0aG9ycyBpbiB0aGUgc2Nob29scyBzaG91bGQgYWxzbyBiZSBjb25zaWRlcmVkIHdoaWxlIHN0dWR5aW5nIHRoZSBoaXN0b3J5IG9mIHBoaWxvc29waHkuIFNvIHRoZSBhbmFseXNpcyBjYW4gYmUgaW1wcm92ZWQgaWYgd2UgdGFrZSB0aGUgb3RoZXIgZmFjdG9ycyBpbnRvIGNvbnNpZGVyYXRpb24uCg==